当我运行此程序时:
#!/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
上失败。为什么会失败?
答案 0 :(得分:2)
默认情况下,File::Find
会在每个目录递归时chdir
。
因此,对$File::Find::name
./1128/00
值./1128/./1128/00
执行stat
实际上是在查找不存在的文件$_
。
要获得所需的行为,只需在my $st = stat($_) or die "stat failed for $_: $!";
变量上执行文件操作。
{{1}}