URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6856
[ Назад ]

Исходное сообщение
"Perl: Удаление пустой ветки каталогов"

Отправлено demosfenus , 17-Окт-07 12:59 
Ситуация:
Есть некое файловое хранилище с какой-то структурой папок.
Простенький скрипт по заданному расписанию чистит его, удаляя файлы удовлетворяющие определенным требованиям. Используется File::Find.

Вопрос:
Как автоматом удалять оставшиеся пустыми папки чтобы не плодить мусор?

Если в процедуру удаления файлов в конце добавить rmdir, то текущий каталог удалится если он остался пустым, а каталог на один уровень выше уже нет!


Содержание

Сообщения в этом обсуждении
"Perl: Удаление пустой ветки каталогов"
Отправлено Alu , 17-Окт-07 13:15 
>Вопрос:
>Как автоматом удалять оставшиеся пустыми папки чтобы не плодить мусор?

Рекурсивный обход с удалением не подойдёт?
Функции передаётся корневая папка хранилища. Она ищет все подпапки текущей папки, и для каждой запускает сама себя. Потом проверяет текущую папку на пустоту, и если она пуста, удаляет тек. папку.


"Perl: Удаление пустой ветки каталогов"
Отправлено demosfenus , 17-Окт-07 14:08 
>>Вопрос:
>>Как автоматом удалять оставшиеся пустыми папки чтобы не плодить мусор?
>
>Рекурсивный обход с удалением не подойдёт?
>Функции передаётся корневая папка хранилища. Она ищет все подпапки текущей папки, и
>для каждой запускает сама себя. Потом проверяет текущую папку на пустоту,
>и если она пуста, удаляет тек. папку.

А если глубина структуры большая такой алгоритм всю оперативку не сожрет?


"Perl: Удаление пустой ветки каталогов"
Отправлено _Android_ , 17-Окт-07 15:02 
>А если глубина структуры большая такой алгоритм всю оперативку не сожрет?

Есть такой косяк. Можно модифицировать алгоритм и рекурсию заменить стеком и циклом(впринципе та же рекурсия, но более экономная).



"Perl: Удаление пустой ветки каталогов"
Отправлено demosfenus , 17-Окт-07 15:23 
>>А если глубина структуры большая такой алгоритм всю оперативку не сожрет?
>
>Есть такой косяк. Можно модифицировать алгоритм и рекурсию заменить стеком и циклом(впринципе
>та же рекурсия, но более экономная).

А нет чего-либо типа модуля File::Find но для работы с каталогами?


"Perl: Удаление пустой ветки каталогов"
Отправлено NuINu , 17-Окт-07 17:02 
>>>А если глубина структуры большая такой алгоритм всю оперативку не сожрет?
>>
>>Есть такой косяк. Можно модифицировать алгоритм и рекурсию заменить стеком и циклом(впринципе
>>та же рекурсия, но более экономная).
>
>А нет чего-либо типа модуля File::Find но для работы с каталогами?

удаляй пряом из филе финд.
#!/usr/bin/perl -w

use 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;
}


"Perl: Удаление пустой ветки каталогов"
Отправлено demosfenus , 17-Окт-07 23:45 
>>А нет чего-либо типа модуля File::Find но для работы с каталогами?
>
>удаляй пряом из филе финд.

Супер: работает быстро и ничего не грузит.
Спасибо огромное за код!


"Perl: Удаление пустой ветки каталогов"
Отправлено angra , 17-Окт-07 18:41 
>А если глубина структуры большая такой алгоритм всю оперативку не сожрет?

А вы представляете какую глубину надо создать для этого? Кроме-того File::Find работает аналогичным образом, отжирая при этом больше памяти. Если он у вас справляется, то и такой обход справится :)


"Perl: Удаление пустой ветки каталогов"
Отправлено demosfenus , 17-Окт-07 22:23 
Спасибо попробую.