Ситуация:
Есть некое файловое хранилище с какой-то структурой папок.
Простенький скрипт по заданному расписанию чистит его, удаляя файлы удовлетворяющие определенным требованиям. Используется File::Find.Вопрос:
Как автоматом удалять оставшиеся пустыми папки чтобы не плодить мусор?Если в процедуру удаления файлов в конце добавить rmdir, то текущий каталог удалится если он остался пустым, а каталог на один уровень выше уже нет!
>Вопрос:
>Как автоматом удалять оставшиеся пустыми папки чтобы не плодить мусор?Рекурсивный обход с удалением не подойдёт?
Функции передаётся корневая папка хранилища. Она ищет все подпапки текущей папки, и для каждой запускает сама себя. Потом проверяет текущую папку на пустоту, и если она пуста, удаляет тек. папку.
>>Вопрос:
>>Как автоматом удалять оставшиеся пустыми папки чтобы не плодить мусор?
>
>Рекурсивный обход с удалением не подойдёт?
>Функции передаётся корневая папка хранилища. Она ищет все подпапки текущей папки, и
>для каждой запускает сама себя. Потом проверяет текущую папку на пустоту,
>и если она пуста, удаляет тек. папку.А если глубина структуры большая такой алгоритм всю оперативку не сожрет?
>А если глубина структуры большая такой алгоритм всю оперативку не сожрет?Есть такой косяк. Можно модифицировать алгоритм и рекурсию заменить стеком и циклом(впринципе та же рекурсия, но более экономная).
>>А если глубина структуры большая такой алгоритм всю оперативку не сожрет?
>
>Есть такой косяк. Можно модифицировать алгоритм и рекурсию заменить стеком и циклом(впринципе
>та же рекурсия, но более экономная).А нет чего-либо типа модуля File::Find но для работы с каталогами?
>>>А если глубина структуры большая такой алгоритм всю оперативку не сожрет?
>>
>>Есть такой косяк. Можно модифицировать алгоритм и рекурсию заменить стеком и циклом(впринципе
>>та же рекурсия, но более экономная).
>
>А нет чего-либо типа модуля File::Find но для работы с каталогами?удаляй пряом из филе финд.
#!/usr/bin/perl -wuse strict;
use File::Find;
use Data::Dumper;my @directories_to_search = ('./testdir1');
finddepth({ wanted => \&wanted, no_chdir => 1 }, @directories_to_search);sub wanted {
my $t = $_;
#print "file: $File::Find::name\n";
#print "it is: $t\n";
my $cnt;
my $name = $File::Find::name;
if(-d $name) {
print "$name \tis directory!\n";
if(is_empty($name)) {
print "$name \tis EMPTY directory!\n";
if(!rmdir($name)) {
print "Error delete $name with errno: $!\n";
}
}
} elsif(-f $name) {
print "$name \tis file!\n";
} else {
print "$name \tis unknown type!\n";
}
}
sub is_empty {
my $dir = shift;
my @d;
my $rez = 0;
opendir(FDIR, $dir);
@d = readdir FDIR;
close(FDIR);
if(@d) {
$rez = 1 if ($#d+1 <= 2);
}
return $rez;
}
>>А нет чего-либо типа модуля File::Find но для работы с каталогами?
>
>удаляй пряом из филе финд.Супер: работает быстро и ничего не грузит.
Спасибо огромное за код!
>А если глубина структуры большая такой алгоритм всю оперативку не сожрет?А вы представляете какую глубину надо создать для этого? Кроме-того File::Find работает аналогичным образом, отжирая при этом больше памяти. Если он у вас справляется, то и такой обход справится :)
Спасибо попробую.