perl脚本只删除目录中的内容而不删除目录

时间:2018-03-19 16:34:00

标签: perl

我有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;
  }
}

但是上面的代码只删除了目录和子目录中的内容,留下了所有空文件夹。 任何人都可以帮助我完成上述编码所做的更改,以便删除文件和目录。

2 个答案:

答案 0 :(得分:4)

unlink不删除目录,只删除文件。

  

注意:除非您这样做,否则unlink不会尝试删除目录   超级用户和-U标志提供给Perl。即使这些   条件得到满足,请注意取消链接目录可能会造成   文件系统损坏。最后,在目录上使用unlink不是   许多操作系统都支持。请改用rmdir。

您想要rmdir,并且您可能希望查看-d要使用哪一个,除非您不关心警告。

答案 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条件。非空的将保留。无法删除的目录可能会发出警告......