Perl如何验证路径是目录却不能同时调用opendir()?

Jam*_*hin 3 perl find

我试图找到空的子目录并删除它们。我敢肯定,有更好的方法可以实现这一点(我是一个贫穷的程序员,并且在Perl中相对较新),但是即使如此,我仍然想了解我的方法有什么问题。

use strict;
use warnings;
use File::Basename; 
use File::Find

my $lambda2 = sub
{
    my $path = $File::Find::name;
    if ( -d $path )
    {
        print("Directory: ", $path, "\n");

        # Define anonymous function to test if directory is empty
        my $hasContent = sub
        {
            my $directory = shift;
            opendir ( my $dh, $directory );
            return scalar ( grep { $_ ne "." && $_ ne ".." } readdir ( $dh ) );
        };
        # Remove item if it is an empty directory
        if ( ! $hasContent->( $path ) )
        {
            rmdir( $path );
        }
    }
};
my $directory = "/Users/username/testdir/";

find( { wanted => $lambda2, no_chdir => 1 }, $directory );
Run Code Online (Sandbox Code Playgroud)

例如,如果testdir有一个名为testsubdir的空子目录,我将得到看似矛盾的响应:

Directory: /Users/username/testdir
Directory: /Users/username/testdir/testsubdir
Can't opendir(/Users/username/testdir/testsubdir): No such file or directory
Run Code Online (Sandbox Code Playgroud)

后一个目录的打印表示它已通过-d检查,但随后的错误消息指出没有这样的目录。据我所知,两者之间什么也没有发生。

zdi*_*dim 6

可以find这么说,代码删除了脚下的目录。

最简单的解决方法:更改findfinddepth,以进行后继遍历,因为

调用目录的内容调用该&wanted函数。

(最初的重点)然后它将不会尝试wanted在刚刚删除的目录上调用。

或者,仅收集其中的空目录列表,find并在find完成后将其删除。