perl如何遍历指定文件夹下的指定扩展名文件,并按时间顺序要求删除
(linux下)要求是,遍历/ccd/pa/下的所有后缀为log的文件(包括所有子文件夹),只保留时间顺序离现在最近的20个文件,其它删除。具体怎么实现啊。...
(linux下)要求是,遍历/ccd/pa/下的所有后缀为log的文件(包括所有子文件夹),只保留时间顺序离现在最近的20个文件,其它删除。具体怎么实现啊。
展开
展开全部
用正则表达式去找你要删的文件,匹配扩展名。用stat函数获取文件访问/创建时间。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#!/usr/bin/perl -w
my $basedir = '/ccd/pa/';
my $num = 20;
my $pattern = 'log$';
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";
my $basedir = '/ccd/pa/';
my $num = 20;
my $pattern = 'log$';
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";
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询