我有一个基本的Perl脚本,该脚本应该递归遍历目录树。
#!/usr/bin/perl -w
use strict;
use File::Find;
my $dir = '/mnt/drawings';
find(\&process_file, $dir);
sub process_file
{
print("$File::Find::name\n");
}
但是当我在CentOS系统上运行它时,它仅在20个目录的“ / mnt / drawings”下打印第一级。但是当我在FreeBSD系统上运行相同的脚本时,它会打印出成千上万个文件...
我的CentOS系统上缺少什么?
更新:
两个系统都在FreeNAS上装载相同的数据。
如果运行ls -lR
,则可以看到所有文件:
这是前几个文件夹:
drwxr-xr-x. 2 root root 0 Mar 25 2011 2008dwgs
drwxr-xr-x. 2 root root 0 Nov 19 2015 2009dwgs
drwxr-xr-x. 2 root root 0 Oct 21 2016 2010dwgs
drwxr-xr-x. 2 root root 0 Jun 16 2014 2011dwgs
drwxr-xr-x. 2 root root 0 May 14 17:58 2012dwgs
drwxr-xr-x. 2 root root 0 Nov 29 2016 2013dwgs
drwxr-xr-x. 2 root root 0 Aug 8 2018 2014dwgs
drwxr-xr-x. 2 root root 0 Apr 1 18:11 2015dwgs
drwxr-xr-x. 2 root root 0 Jul 28 21:55 2016dwgs
drwxr-xr-x. 2 root root 0 Jun 17 12:39 2017dwgs
drwxr-xr-x. 2 root root 0 Jun 11 10:27 2018dwgs
drwxr-xr-x. 2 root root 0 Jul 26 15:40 2019dwgs
这是在2008dwgs文件夹中:
./2008dwgs:
total 0
drwxr-xr-x. 2 root root 0 May 20 2014 08002-01
drwxr-xr-x. 2 root root 0 Apr 9 2011 08003
drwxr-xr-x. 2 root root 0 May 28 2013 08008
drwxr-xr-x. 2 root root 0 Nov 10 2014 08009
drwxr-xr-x. 2 root root 0 Jan 23 2008 08011
在08002-01文件夹中:
./2008dwgs/08002-01:
total 0
drwxr-xr-x. 2 root root 0 May 20 2014 ArchDwgs
drwxr-xr-x. 2 root root 0 Aug 28 2014 BASES
drwxr-xr-x. 2 root root 0 May 20 2014 FinalPDF
drwxr-xr-x. 2 root root 0 Oct 13 2009 Fonts
drwxr-xr-x. 2 root root 0 Aug 27 2014 issued
drwxr-xr-x. 2 root root 0 May 19 2011 NPS Reference
drwxr-xr-x. 2 root root 0 Oct 13 2009 Pen Settings
drwxr-xr-x. 2 root root 0 Aug 27 2014 Received
drwxr-xr-x. 2 root root 0 Dec 8 2009 SketchUp
drwxr-xr-x. 2 root root 0 Jun 24 03:05 Struct
答案 0 :(得分:2)
我想我已经找到了错误。 Perlbug 133673。
我查看了Find.pm中的代码,发现它会自动避免 在目录上使用
stat
时使用目录的链接数 对于nlink返回小于2的值。不幸的是,似乎NAS上的目录返回2作为所有目录的链接数。
这就是您的网络文件系统正在做的事情。
The fix在Perl 5.30.0中。您可以升级,也可以将local $File::Find::dont_use_nlink = 1;
设置为忽略文件系统nlink。