如果目录包含某个文件,如何使用perl rmtree树删除目录?

时间:2013-05-03 12:36:17

标签: perl

我正在尝试删除给定路径上的所有目录,如果它们包含某个文件。

#!/usr/bin/perl

use strict;
use File::Find;
use File::Path qw( rmtree );

find(\&rm_errors, $_) for @ARGV;

sub rm_errors{
     if ($_ eq "git_errors.txt"){
     my $path = $File::Find::dir;
     rmtree( $path );
     } 
 } 

查找包含文件的目录正在运行,但rmtree不会删除该目录。谁能告诉我为什么?

3 个答案:

答案 0 :(得分:5)

对于您提出的直接问题,找出问题所在的方法是使用诊断die语句:

rmtree($path) or die "Cannot rmtree '$path' : $!";

这样,您将了解系统报告的错误。

然而,还有另一个问题。在迭代它时,您正在影响文件系统,这不是一个好主意。这样的事情可能会更好:

my @dirs;
find(sub { push @dirs, $File::Find::dir if $_ eq "git_errors.txt" }, $_) for @ARGV;
for my $path (@dirs) {
    rmtree($path) or die "Cannot rmtree '$path' : $!";
}

也就是说,首先找到目录,然后删除它们。

答案 1 :(得分:0)

据我了解,找到更改目录以遍历文件系统。

(来自perldoc:此外,对于找到的每个目录,它将chdir()放入该目录并继续搜索,在目录中的每个文件或子目录上调用& wanted函数。)

这意味着,除了尝试修改您正在浏览的结构外,您还要进入您尝试删除的目录。

我不认为这可以从命令行运行。

答案 2 :(得分:0)

同样的问题也发生在我身上。 我的代码:

#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw(strftime);
use File::Path;
my $BASE_DIR="/sandeepr/_temp/";
my $f=strftime '%Y-%m-%d',localtime(time() - 24*60*60*60);
print "$f\n";
my $dir_to_be_cleaned=$BASE_DIR.$f;
print $dir_to_be_cleaned;
rmtree($dir_to_be_cleaned);

使用sudo权限运行时代码运行正常,否则bash将抛出权限错误。

执行上述代码时,您将获得