The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Perl: Удаление пустой ветки каталогов"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Perl: Удаление пустой ветки каталогов"  
Сообщение от NuINu (??) on 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;
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Perl: Удаление пустой ветки каталогов"  
Сообщение от demosfenus (ok) on 17-Окт-07, 22:23 
Спасибо попробую.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру