可以使用 perl 一次删除几个目录及其内容吗? 例如:- 我有以下文件夹
我可以像 rm -rf test* 一样删除它们吗? 我试过下面的
system(@rm, '-fr', "$path/test*");
但它不采取
*
首先我必须说,这本质上是危险的,从程序中递归地删除目录。
话虽如此,提供该能力的模块才是核心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/*/"
,但也会转义所有非单词字符。