删除目录中的所有文件,但保留目录?

时间:2014-10-18 08:18:05

标签: perl history delete-file

最简单的方法是什么:

  • 删除给定目录/ files / axis(unlink
  • 中的所有文件
  • 仅限30天以上的文件
  • 空目录应保留(不要rmdir

3 个答案:

答案 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解决方案,我建议使用以下两个模块中的任何一个。

  1. Path::Class

    #!/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";
    }
    
  2. Path::Iterator::Rule

    #!/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;