Сначала я должен сказать, что это опасно по своей природе, рекурсивно удаляя каталоги из программы.
Сказав это, один модуль, который предоставляет такую возможность, является ядром 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
, который работает с именами файлов, которые имеют пробелы. & dagger;
Также может быть безопаснее сначала приблизиться к тому, что вы хотите удалить
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
)
Это, конечно, (вообще) не делает его ошибочным.
Прошу прощения за неоднократные предупреждения, но сообщения о рекурсивном удалении заставляют меня немного нервничать.
& dagger; & thinsp; Или удвойте эти (двойные) кавычки, glob qq{"$path/test*/"}
, или используйте \Q
форму quotemeta , glob "\Q$path/test/*/"
, но которая также ускользает от всех несловесные символы.