2

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

#!/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 没有删除该目录。谁能告诉我为什么?

4

3 回答 3

6

对于您提出的直接问题,找出问题所在的方法是使用诊断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' : $!";
}

也就是说,先找到目录,然后再删除。

于 2013-05-03T12:54:27.827 回答
0

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

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

这意味着,除了尝试修改您正在遍历的结构之外,您还处于您要删除的目录中。

我认为这也不适用于命令行。

于 2015-01-28T05:49:55.410 回答
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 将引发权限错误。

在执行上述代码时,您将得到

于 2018-04-04T04:34:36.487 回答