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

Deb*_*ger 1 perl

使用perl可以一次删除几个目录,包括它们的内容。例如:-我有以下文件夹

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

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

system(@rm, '-fr', "$path/test*");
Run Code Online (Sandbox Code Playgroud)

但它没有 *

zdi*_*dim 6

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

话虽如此,提供此功能的一个模块是核心File :: Path

use File::Path qw(remove_tree);

...

remove_tree( @dirs_to_delete, safe => 1 );
Run Code Online (Sandbox Code Playgroud)

这将croak针对错误,如果递归删除有问题,我认为这是一个很好的主意。但是,如果这不适用于您的设计,则可以使用该error选项,然后由您决定是否检查错误。请参阅错误处理,以及其他一些有用的选项。

这也将删除文件。因此,例如,在编写要吹走的事物列表时要小心

use File::Glob ':bsd_glob';

my @dirs_to_delete = glob "$path/test*/";   # note the trailing /
Run Code Online (Sandbox Code Playgroud)

尾随位置/使得仅返回目录。随着文件::水珠使用的语句,我们得到了glob来自:bsd_glob与有空格的文件名,其工作原理。

首先更接近要删除的内容可能更安全

my $orig_cwd = Cwd::cwd;

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

my @dirs_to_delete = glob "test*/";

# chdir $orig_cwd;
Run Code Online (Sandbox Code Playgroud)

(除了-ing和返回原始选项以外Cwd,还有其他选项) 当然,这(完全)不能使其具有防错能力。chdircwd

请原谅多次警告,但发布递归删除操作会让我有些紧张。


 或双的(双)引号,glob qq{"$path/test*/"}或使用\Q的形式quotemetaglob "\Q$path/test/*/"但也逃脱所有非单词字符。