I have a system for this. The caller script opens a bunch of instances of the main script (1 per server). The main script hunts down all the media files on the servers and puts them into logs called nameofserver.log. Then I run the siftall script to go through all of those logs to sift into logs by file type. Then the deleter script will delete every file listed in a particular log.
The caller script is where the performance gains are made. It allows me to run 100+ servers simultaneously, rather than sequntially. Most use strict. I apologise for those that don't. They were written long ago and never rewritten.
Let me know if you need more info on this...
Main Script
#finds .mp3.avi.exe.mpg.mpeg.mpe.wav.zip.mov.rmj.wma files on a server
#called from the run multi scripts
#added swf 5/17/01
#added pst 7/27/01
# ADDED ANOTHER NESTED IF FOR //SERVER/USERS
# 8.09.01 added .ogg (ogg-vorbis files)
use Getopt::Std;
use File::Find;
getopt('s');
# *********************************
# Process arguments ([h]elp,[s]erver)
# *********************************
if ($opt_s){
$server=$opt_s;
}else{
print "Please Enter Server name:";
chomp($server=<STDIN>);
}
$dir1="//$server/e\$/users";
if (!(-e "$dir1")){#if directory doesn't exist try d$
$dir1="//$server/d\$/users";
if (!(-e "$dir1")){
$dir1="//$server/users";
if (!(-e "$dir1")){
die "Directory not does not exist on $server\n...Exiting S
+cript.\n";
}
}
}
$out="//workstation/share/serverlogs/$server\.tmp";
$out2="//workstation/share/serverlogs/media/$server\.txt";
open (OUTFILE, ">$out") or die "Cannot open $out for write :$!";
print "finding media files on $dir1\.\.\.\n";
find ({wanted => \&wanted, no_chdir=>1}, $dir1);
#find(\&wanted, $dir1);
sub wanted {
if (!("$File::Find::dir"=~/}/)&&(/\.asf$|\.mp.{0,2}$|\.avi$|\.exe$
+|\.wav$|\.zip$|\.mov$|\.rm.?$|\.wm.?$|\.qt$|\.mid.?$|\.ra.?$|\.swf$|\
+.pst$|\.ogg$|\.gho$/i)){
print OUTFILE "$_\n";
print "$_\n";
}
}
close OUTFILE;
open (OUTFILE, "$out") or die "Can't open";
open (OUTFILE2, ">$out2") or die "Can't open";
@input=<OUTFILE>;
foreach (@input){
s/\//\\/g;
print OUTFILE2 "$_";
}
close OUTFILE;
close OUTFILE2;
unlink $out;
Calls the Main script
# Created on 9/6/00
@all=('SERVER1','SERVER2);
use Win32::Process;
sub ErrorReport{
print Win32::FormatMessage( Win32::GetLastError() );
}
foreach $server (@all){
Win32::Process::Create($ProcessObj,
"c:\\program files\\perl\\bin\\perl.exe",
"perl.exe c:\\public\\perl5\\cleanup\\findstuff6.pl -s
+$server",
0,
NORMAL_PRIORITY_CLASS,
".")|| die ErrorReport();
#$ProcessObj->Suspend();
#$ProcessObj->Resume();
#$ProcessObj->Wait(INFINITE);
}
Log Sifter
# sifts all the server logs based on media type
# added func to print -ok at end of empty files, Federal added 5/31/01
# added mpga on 6.08.01
# added pst on 7.27.01
# added a backup of old logs a MMDDYY directory based on the last exe.
+txt time stamp
use strict;
use File::Copy;
my ($type, $server,$out,$in,@input,$total,$kbytes,$mbytes);
my @servers=('SERVER1','Server2');
my $dir1='//workstation/share/serverlogs/media';
my @types=('swf','asf','avi','mp2','mp3','mpg','mpga','mpe','mpeg','wa
+v','mov','qt','mid','midi','ra','ram','rmi','rmj','rmx','zip','exe','
+wma','pst','ogg','gho');
######################
# Create a new directory with the date of the last exe.txt MMDDYY unde
+r sifted
######################
my @statarray=stat('c:/share/serverlogs/media/sifted/exe.txt');
my @statarray2=localtime($statarray[9]);
my $month=$statarray2[4]+1;
my $year=$statarray2[5]-100;
my $dirname=sprintf("$dir1/sifted/%.2d%.2d%.2d",$month,$statarray2[3],
+($statarray2[5]-100));
######################
# Backup the old logs to the new dir
######################
opendir(DIR, "$dir1/sifted") or die "can't opendir $dir1: $!";
my @files = grep { !/^\./ && -f "$dir1/sifted/$_" } readdir(DIR);
closedir DIR;
mkdir ("$dirname")or die "Couldn't mkdir! $!";
foreach (@files){
copy("$dir1/sifted/$_","$dirname")or die "Couldn't Copy! $!";
}
unlink <$dir1/sifted/*.txt>;
######################
# Sort the logs
######################
foreach $type (@types){
$total=0;
my $out="$dir1/sifted/$type\.txt";
my $out2="$dir1/sifted/$type-ok\.txt";
open OUT, ">$out" or die "Cannot open $out for write :$!";
foreach $server (@servers){
$in="$dir1/$server\.txt";
open IN,"$in" or next;
@input=<IN>;
chomp @input;
foreach (@input){
if (/\.$type$/i){
$kbytes = (stat)[7]/1024;
$total+=$kbytes;
print OUT "$_\t$kbytes KB\n";
}
}
close IN;
}
$mbytes=$total/1024;
print OUT "\n\nTotal: $mbytes MB\n";
close OUT;
if ($mbytes eq 0){
rename $out, $out2;
}
print "Finished $type...\n";
}
Delete files by log
#deletes MP3 files noted in the sifted MP3 log
# usage: deletemp3.pl mp3[enter]
use strict;
my $infile="//workstation/share/serverlogs/media/sifted/$ARGV[0].txt";
my $outfile="//workstation/share/serverlogs/media/sifted/$ARGV[0]-dele
+ted.txt";
my %filehash;
open IN, "$infile" or die "Cannot open $infile for write :$!";
my @input=<IN>;
close IN;
foreach (@input){
my ($file,$size)=split /\t/;
$filehash{$file}=$size;
}
foreach (sort keys %filehash){
if(-e){
unlink "$_" or warn "\ncan't delete $_:$!\n";
print "$_ deleted\n";
}else{
print"file does not exist\n"
}
}
rename $infile, $outfile;
-OzzyOsbourne |