Как вывести список каталогов с указанным именем, которым более 90 дней, и удалить их с помощью сценария perl? - PullRequest
0 голосов
/ 13 декабря 2018

Я использовал эту команду, чтобы получить ее, но она не удалась.Потому что у меня не установлен модуль для File :: Find :: Rule, и он работает только для файлов.

use warnings;
use strict;

use File::Find::Rule;

my $dir = '.';
my $days = 90;

my @files = File::Find::Rule->file()
                            ->maxdepth(1)
                            ->in($dir);

for my $file (@files){
    if (-M $file > 90){
        print "deleting $file\n";
        unlink $file or warn $!;
    }
}

1 Ответ

0 голосов
/ 13 декабря 2018

Ваш код построен так, что позволяет обрабатывать только файлы старше 90 дней, а не каталоги :

  • file()правило File::Find::Rule соответствует только файлам и исключает каталоги: вам нужно удалить это правило
  • Встроенная в Perl функция unlink может удалять только файлы, но не каталоги;чтобы удалить каталоги, вы можете, например, использовать метод remove_tree из модуля кода File::Path.

Также можно добавить правило mtime кFile::Find::Rule поиск, чтобы отфильтровать файлы (и каталоги) по дате изменения заранее, а не впоследствии в цикле for.mtime ожидает отметку времени эпохи (см. perldoc stat ).

В приведенном ниже коде используется File::Find::Rule для поиска всех файлов / каталогов в текущем каталоге, которые не были изменены с 90 дней (только один уровень глубоко).Затем он обходит возвращенные пути и применяет правильный метод удаления в соответствии с типом пути (файл или каталог).Он также включает защиту, которая предотвращает удаление текущего каталога, даже если он не изменялся с 90 дней.

use warnings;
use strict;

use File::Find::Rule;
use File::Path qw/remove_tree/;

my $dir = ".";
my $mtime = time - 90 * 60 * 60 * 24;

my @things = File::Find::Rule->maxdepth(1)->mtime( "<= $mtime" )->in($dir);

for my $thing (@things) {
    next if $thing eq $dir;
    if ( -f $thing) {
        unlink $thing or warn "could not delete file $thing : $!";
    } else {
        remove_tree($thing);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...