Мне нужно удалить весь контент (файлы и папки) в данной папке. Проблема в том, что в папке находятся миллионы файлов и папок. Поэтому я не хочу загружать все имена файлов за один раз .
Логика должна быть такой:
- итерация папки без загрузки всего
- получить файл или папку
- удали это
(подробно, что файл или папка "X" были удалены)
- перейти к следующему
Я пытаюсь что-то вроде этого:
sub main(){
my ($rc, $help, $debug, $root) = ();
$rc = GetOptions ( "HELP" => \$help,
"DEBUG" => \$debug,
"ROOT=s" => \$root);
die "Bad command line options\n$usage\n" unless ($rc);
if ($help) { print $usage; exit (0); }
if ($debug) {
warn "\nProceeding to execution with following parameters: \n";
warn "===============================================================\n";
warn "ROOT = $root\n";
} # write debug information to STDERR
print "\n Starting to delete...\n";
die "usage: $0 dir ..\n" unless $root;
*name = *File::Find::name;
find \&verbose, @ARGV;
}
sub verbose {
if (!-l && -d _) {
print "rmdir $name\n";
} else {
print "unlink $name\n";
}
}
main();
Работает нормально, но всякий раз, когда «find» читает огромную папку, приложение застревает, и я вижу, как системная память для Perl увеличивается до истечения времени ожидания. Зачем? Он пытается загрузить все файлы за один раз?
Спасибо за вашу помощь.