最简单的方法是什么:
unlink
)rmdir
)答案 0 :(得分:2)
这会按照你的要求行事。它使用opendir
/ readdir
列出目录。 stat
获取所有必要信息,后续-f _
和-M _
来电检查该项目是否为文件且超过30天而不重复stat
来电。
use strict;
use warnings;
use 5.010;
use autodie;
no autodie 'unlink';
use File::Spec::Functions 'catfile';
use constant ROOT => '/path/to/root/directory';
STDOUT->autoflush;
opendir my ($dh), ROOT;
while (readdir $dh) {
my $fullname = catfile(ROOT, $_);
stat $fullname;
if (-f _ and -M _ > 30) {
unlink $fullname or warn qq<Unable to delete "$fullname": $!\n>;
}
}
如果你想删除某个目录下下面的文件,我已经开始相信了,那么你需要File::Find
。整体结构与我原来的代码没有什么不同。
use strict;
use warnings;
use 5.010;
use autodie;
no autodie 'unlink';
use File::Spec::Functions qw/ canonpath catfile /;
use File::Find;
use constant ROOT => 'E:\Perl\source';
STDOUT->autoflush;
find(\&wanted, ROOT);
sub wanted {
my $fullname = canonpath($File::Find::name);
stat $fullname;
if (-f _ and -M _ < 3) {
unlink $fullname or warn qq<Unable to delete "$fullname": $!\n>;
}
}
答案 1 :(得分:1)
更简单的方法是“不用perl”。
find /files/axis -mtime +30 -type f -exec rm {} \;
答案 2 :(得分:0)
对于跨平台兼容的Perl解决方案,我建议使用以下两个模块中的任何一个。
#!/usr/bin/env perl
use strict;
use warnings;
use Path::Class;
my $dir = dir('/Users/miller/devel');
for my $child ( $dir->children ) {
next if $child->is_dir || ( time - $child->stat->mtime ) < 60 * 60 * 24 * 30;
# unlink $child or die "Can't unlink $child: $!"
print $child, "\n";
}
#!/usr/bin/env perl
use strict;
use warnings;
use Path::Iterator::Rule;
my $dir = '/foo/bar';
my @matches = Path::Iterator::Rule->new
->file
->mtime( '<' . ( time - 60 * 60 * 24 * 30 ) )
->max_depth(1)
->all($dir);
print "$_\n" for @matches;