Perl File :: Find不是递归运行

时间:2019-08-03 00:19:32

标签: perl

我有一个基本的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

1 个答案:

答案 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。