2

当我运行这个程序时:

#!/usr/bin/perl -w

use File::Find;
use File::stat;
use Time::gmtime;
use Fcntl ':mode';

my %size = ();
my @directory = ('.');

find(
    sub {
        my $st = stat($File::Find::name) or die "stat failed for $File::Find::name : $!";
        if ( defined $st )
        {
            my $gm = gmtime $st->mtime;
            $size{$gm->year + 1900} += $st->blksize unless S_ISDIR($st->mode);
        }
        else
        {
            print "stat failed for ", $File::Find::name, ": $!\n";
        }
    },
    @directory);

foreach my $year (keys %size)
{
    print "$year ", $size{$year}, "\n";
}

我明白了stat failed for ./1128/00 : No such file or directory at ./size.pl line 13.。但是,当我列出它时,它就在那里:

# ls ./1128/00
03  05  07  09  12  14  18  20  22  24  27  29  32  34  37  40  43  45  47  50  52  54 57  59  63  65  67  69  75  78  81  83  85  88  90  92  95
04  06  08  11  13  15  19  21  23  25  28  31  33  35  39  41  44  46  48  51  53  55  58  61  64  66  68  71  77  79  82  84  86  89  91  93

根据我为这个问题删除的诊断,我可以看到它确实成功地统计了前 4 个文件以及.目录和1128目录(父目录1128/00)。它总是成功地统计相同的文件和目录并在1128/00. 为什么会失败?

4

1 回答 1

2

默认情况下,File::Findchdir递归到每个目录。

因此,stat对 的$File::Find::name值执行./1128/00实际上是在寻找./1128/./1128/00不存在的文件。

要获得您想要的行为,只需对$_变量执行文件操作。

my $st = stat($_) or die "stat failed for $_: $!";
于 2014-07-16T21:47:26.003 回答