如何使用Perl删除目录及其空祖先?

n.r*_*.r. 2 perl rmdir

什么是删除目录的Perl方法,然后是所有空的 目录,直到第一个非空目录?换句话说,可以使用什么而不是:

system 'rmdir', '-p', $directory;
Run Code Online (Sandbox Code Playgroud)

哪个,d首先删除d,然后c,然后b,但不是a,因为a仍然包含x,像这样:

a
a/b
a/b/c
a/b/c/d
a/x
Run Code Online (Sandbox Code Playgroud)

导致

a
a/x
Run Code Online (Sandbox Code Playgroud)

这不是内置的rmdir,因为它只能删除一个单一的目录.(doc)

它不是finddepth ( sub {rmdir}, '.' ),使用File::Find,因为它删除了孩子,而不是父母.(doc)

这也不是模块的remove_tree功能File::Path,因为它不仅删除子目录而且删除文件.(doc)

注意,remove_treefinddepth在Bash的相反方向工作rmdir --parent.

ike*_*ami 5

use Path::Tiny qw( path );

my $p = path('a/b/c/d');

while (!$p->is_rootdir()) {
    if (!rmdir($p)) {
        last if $!{ENOTEMPTY};
        die("Can't remove \"$p\": $!\n");
    }

    $p = $p->parent;
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 高效.通过检查结果rmdir而不是使用->children->iterator,这个解决方案避免了不必要的调用readdir.

  • 没有比赛条件.与使用readdir(通过->children->iterator)的解决方案不同,此解决方案不会遇到竞争条件.

  • 此解决方案还避免-d了早期解决方案使用的冗余检查.

  • 与之前的解决方案不同,此解决方案将处理除了要删除的目录之外的空树.