gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:47:39 24 4
gpt4 key购买 nike

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

system 'rmdir', '-p', $directory;

d 开始,将首先删除 d,然后是 c,然后是 b,但不是 a,因为 a 仍将包含 x,如下所示:

a
a/b
a/b/c
a/b/c/d
a/x

导致

a
a/x

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

这不是 finddepth ( sub {rmdir}, '.' ),使用 File::Find,因为它删除了 children,而不是 parent 。 ( doc )

它也不是 File::Path 模块的 remove_tree 函数,因为它不仅会删除子目录,还会删除 文件。 ( doc )

注意,remove_treefinddepth 的工作方向与 Bash rmdir --parent 相反。

最佳答案

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;
}

注意事项:

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

  • 没有竞争条件。与使用 readdir 的解决方案(通过 ->children->iterator)不同,此解决方案不会出现竞争条件。

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

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

关于perl - 如何使用 Perl 删除目录及其空祖先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43401051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com