File :: stat返回"没有这样的文件或目录"

时间:2014-07-16 18:36:57

标签: perl stat file-find

当我运行此程序时:

#!/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上失败。为什么会失败?

1 个答案:

答案 0 :(得分:2)

默认情况下,File::Find会在每个目录递归时chdir

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

要获得所需的行为,只需在my $st = stat($_) or die "stat failed for $_: $!"; 变量上执行文件操作。

{{1}}