(linux下)要求是,遍历/ccd/pa/下的所有后缀为log的文件(包括所有子文件夹),只保留时间顺序离现在最近的20个文件,其它删除。
my $num = 20;
my $pattern = 'log$';
#my $basedir = '/ccd/pa/';
my @files = ();
my @dirs = ($basedir);
die "error $basedir: $!" unless(-d $basedir);
# recursively find all files
while(@dirs){
$d = $dirs[0];
$d .= "/" unless($d=~/\/$/);
for my $f (glob($d . '*')){
push(@dirs, $f) if(-d $f) ;
push(@files,$f)if(-f $f && $f=~/$pattern/);
}
shift @dirs;
}
#sort according to modified-time
@files=sort{
@sta1=stat($a);
@sta2=stat($b);
$sta2[9]<=>$sta1[9];
}@files;
# delete files earlier than the $num-th
@files2del = @files[$num..@files-1];
my $cnt = 0;
if(@files2del){
local $"="\n\t";
print "going to delete these files:\n\t@files2del\n[y/N]?";
my $choice = <>||'N';
$cnt = unlink(@files2del)if($choice =~ /^\s*y\s*$/i);
}
print "$cnt files deleted\n";
觉得不错,转载下,来自百度知道