1: #!/usr/bin/perl -w
2: #
3: # This peice of code recursivly searches directories
4: # untill it hits the end of its tree for files that
5: # have been modified in the last 10 days. In this case
6: # Im only searching for mp3 files....but that can easily
7: # be hacked out.
8: #
9: # It then symlinks the final directory of the tree from where
10: # the file that was modified lately into your $ndir. It then
11: # creates another text file that specifies exactly what files
12: # were updated lately in that directory that was symlinked. Hrm
13: # I think thats it...
14: #
15: # This was done so I could move my rips out of incoming/
16: # as soon as they were put in there, and still know what
17: # I had uploaded in the past few days. ( Previously I kept
18: # them in the incoming/ directory till I Made sure they were
19: # all ok rips.
20: #
21: # Mark Thomas <mark@cidera.com>
22:
23: use strict;
24:
25: # This is the directory you want to begin your recursive search
26: my $mdir = "/home/ackers";
27:
28: # Where the symlinks and files will be created.
29: my $ndir = "/home/ackers/new";
30:
31: # These are directories you want excluded from the search.
32: my @dont = ("$mdir/pub","$mdir/software","$mdir/stuff",
33: "$mdir/.ssh","$mdir/.BitchX","$mdir/.ncftp",$ndir);
34:
35: my($subdirz,@subdirs,$all,$wank,$orig,@moded_files,$m_files,$mdirs,$mfiles,%data,$newfd);
36:
37:
38: # We first unlink all the current files in $ndir
39: opendir (NEW, "$ndir") or die "$! $ndir dont exist!!!\n";
40: foreach $newfd (readdir(NEW))
41: {
42:
43: next if $newfd =~ /^\./; # We dont want "."'s and ".."'s
44: my $fullnewfd = "$ndir/$newfd";
45: unlink ($fullnewfd) or die "cant unlink $newfd!\n";
46:
47: }
48:
49:
50: readdirz($mdir);
51:
52: foreach $subdirz (@subdirs)
53: {
54:
55: readdirz($subdirz);
56:
57: }
58:
59: # we now have all our directories and sub's
60: # in an array. Now to stat each file in those
61: # dirs.
62: foreach $all (@subdirs)
63: {
64:
65: opendir (SUBDIR, $all);
66:
67: foreach $wank (readdir(SUBDIR)) {
68: $orig = $wank;
69: $wank = "$all/$wank";
70:
71: if (-f $wank)
72: {
73: next if $wank !~ /\.mp3/; # Next if the file isnt an mp3.
74: my ($dev,$ino,$mode,$nlink,$uid,$gid,
75: $rdev,$size,$atime,$mtime,$ctime,
76: $blksize,$blocks) = stat $wank;
77: my $curr = time;
78: my $diff = $curr - $mtime;
79:
80: if ($diff <= 864000)
81: {
82: push(@moded_files, $wank);
83: }
84: }
85: } closedir(SUBDIR);
86:
87: }
88:
89: # We now have a listing of modified or created
90: # files within the last 10 days.
91: foreach $m_files (@moded_files)
92: {
93:
94: # match everything up to last "/" then match
95: # everything after that and push our matches
96: # into a hash of lists.
97: $m_files =~ s/^(.*)\/(.*?\.*)$//g;
98: push @{$data{$1}},$2;
99:
100: }
101: foreach $mdirs ( keys %data )
102: {
103:
104: my $mdirs2 = $mdirs;
105: $mdirs2 =~ s/$mdir//g; #- Pure athstetics, get rid of the $mdir
106: $mdirs2 =~ s/\// \\ /g; #- turn /'s into \'s so we can symlink
107: # and keep good organazation.
108: my $sym = "$ndir/$mdirs2"; #- need to make the mdir2 a full path for
109: # the acctuall symlink.
110: symlink $mdirs, $sym; #- the symlink :)
111: open(LISTING, ">$sym.updated.txt");
112: foreach $mfiles (@{$data{$mdirs}})
113: {
114: print LISTING "\t$mfiles\n";
115: }
116: close(LISTING);
117: }
118: sub readdirz
119: {
120:
121: my($dir_to_read) = @_;
122: my($dirz,$excluded_dir);
123: opendir (DIR, "$dir_to_read") or print "DOH $! $dir_to_read\n";
124: foreach $dirz (readdir(DIR))
125: {
126: $dirz = "$dir_to_read/$dirz" ;
127: next if $dirz =~ /\./;
128: # This is the part that makes it exclude directories
129: # were not allowed to access defined in the @dont array
130: # at the top.
131: foreach $excluded_dir (@dont)
132: {
133: if ($dirz =~ /$excluded_dir/)
134: {
135: $dirz = "";
136: }
137: }
138: next if $dirz eq "";
139: if (-d $dirz)
140: {
141: push (@subdirs, $dirz);
142: }
143:
144: } closedir(DIR);
145:
146: }