我有perl代码来删除目录中的文件以及后来的目录。
find ( sub {
my $file = $File::Find::name;
if ( -f $file ) {
push (@file_list, $file);
}
}, @find_dirs);
for my $file (@file_list) {
my @stats = stat($file);
if ($now-$stats[9] > $AGE) {
unlink $file;
}
}
但是上面的代码只删除了目录和子目录中的内容,留下了所有空文件夹。 任何人都可以帮助我完成上述编码所做的更改,以便删除文件和目录。
答案 0 :(得分:4)
unlink
不删除目录,只删除文件。
注意:除非您这样做,否则unlink不会尝试删除目录 超级用户和-U标志提供给Perl。即使这些 条件得到满足,请注意取消链接目录可能会造成 文件系统损坏。最后,在目录上使用unlink不是 许多操作系统都支持。请改用rmdir。
答案 1 :(得分:1)
我只是把代码放在一起,所以你可以赞成首先回答的@simbabque。尝试:
finddepth( sub {
my $file = $File::Find::name;
my @stats = stat($file);
if( -f $file && $now - $stats[9] > $AGE ) {
unlink $file;
}
elsif( -d $file ) {
rmdir $file;
}
}, @find_dirs );
一些评论:
File::Find
将找到文件和目录。
-f
检查文件; -d
用于目录。
rmdir
只会在目录为空时删除目录。这就是为什么必须先删除文件。 finddepth
处理此问题。
-f
和-d
易于使用,但stat
也可用于此类检查(请参阅第二个字段模式。 )
我没有测试过代码;我不能轻易地重建你的条件。
编辑:现在它使用finddepth
代替find
,因为:
finddepth()的工作原理与find()类似,只是它在为目录的内容调用目录之后调用目录的& wanted函数。它执行后序遍历而不是前序遍历,从目录树的底部开始工作,其中find()从树顶部开始工作。
这应该注意按顺序删除目录,最先深入。如果文件中保留的文件与删除条件不匹配,则某些目录可能仍未删除。如果您希望在空时删除它们而不管其时间戳如何,则删除if -d
条件。非空的将保留。无法删除的目录可能会发出警告......