我如何使用perl删除目录及其内容?

问题描述 投票:0回答:1

可以使用 perl 一次删除几个目录及其内容吗? 例如:- 我有以下文件夹

  • 测试1
  • 测试2
  • 测试3
  • 测试4

我可以像 rm -rf test* 一样删除它们吗? 我试过下面的

system(@rm, '-fr', "$path/test*");

但它不采取

*

perl
1个回答
6
投票

首先我必须说,这本质上是危险的,从程序中递归地删除目录。

话虽如此,提供该能力的模块才是核心File::Path

use File::Path qw(remove_tree);

...

remove_tree( @dirs_to_delete, safe => 1 );

这将在错误时

croak
,在我看来,如果递归删除遇到麻烦,这是一个非常好的主意。但如果这不适用于您的设计,您可以使用
error
选项,然后由您来检查错误。请参阅错误处理,并查看其他一些有用的选项。

这也会删除文件。因此,在列出要吹走的东西时要小心,例如

use File::Glob ':bsd_glob';

my @dirs_to_delete = glob "$path/test*/";   # note the trailing /

其中尾随的

/
使得仅返回目录。使用 File::Glob use 语句,我们从
glob
获得
:bsd_glob
,它适用于有空格的文件名。 或者当然可以使用 -d filetest
grep { -d } glob "$path/test*";

添加显式过滤器

首先“接近”您要删除的内容也可能更安全

my $orig_cwd = Cwd::cwd;

chdir $path  or die "Can't \"chdir $path\": $!";

my @dirs_to_delete = glob "test*/";

# chdir $orig_cwd;

(除了

Cwd
之外,还有其他选项可以进行
chdir
-ing并返回到原来的
cwd

这当然不能(根本)使其防错。

请原谅重复的警告,但发布递归删除让我有点紧张。


 或者双引号,

glob qq{"$path/test*/"}
,或使用
\Q
形式的quotemeta
glob "\Q$path/test/*/"
,但也会转义所有非单词字符。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.