首页 > 解决方案 > Perl File::Find 没有递归运行

问题描述

我有这个基本的 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 系统上运行它时,它只会在 '/mnt/drawings' 大约 20 目录下打印第一级。但是当我在我的 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

标签: perl

解决方案


我想我已经找到了错误。Perlbug 133673

我查看了 Find.pm 中的代码,我发现当目录stat上的 nlink 返回小于 2 时,它会自动避免使用指向目录的链接数。不幸的是,NAS 上的目录似乎返回 2 作为所有目录的链接数。

这就是您的网络文件系统正在做的事情。

修复在 Perl 5.30.0 中。您可以升级,也可以设置local $File::Find::dont_use_nlink = 1;为忽略文件系统 nlink。


推荐阅读