2012-06-05 6 views
0

У меня есть требование удалить все файлы в каталогах с именем «архив» старше X дней. Существует несколько каталогов с именем «архив», расположенных в разных глубинах дерева каталогов.Поиск каталогов с именем «архив» и удаление файлов

Мой вопрос - какой инструмент использовать для поиска каталогов? Моим первым импульсом является использование модуля Perl File:Find, но в последнее время я смущен, обнаружив однострочный сценарий оболочки, чтобы сделать то же самое, что и для многострочного Perl-скрипта.

+0

Вы смотрели на метко названный 'find' еще? – Hasturkun

+0

Уверены, но find не поддерживает подстановочный путь пути к каталогу. Например/path/*/archive/*. Поэтому я должен был бы объявить полный путь для каждого каталога архива в дереве, близкого к 100 и растущего. – clmccomas

ответ

3

Может быть, это будет работать для вас:

# Delete one at a time. 
find /path/to/your/files* -type f -mtime +10 -exec rm {} \; 

# Use one rm for multiple dirs. (GNU find) 
find /path/to/your/files* -type f -mtime +10 -exec rm {} + 

# Use one rm for multiple dirs. (Any find) 
find /path/to/your/files* -type f -mtime +10 -print0 | xargs -0 rm 

В этом случае будут удалены все файлы с вашего пути, которые старше, чем за 10 дней. Используйте его с осторожностью. :-)

Если вы просто хотите, чтобы удалить файлы в архиве папки, вы должны добавить

-ipath '*/archive/*' 

в

find /path/to/your/files* -ipath '*/archive/*' -type f -mtime +10 -exec rm {} \; 

Может быть, вы должны проверить весь сценарий, записывая найденные файлы в текстовый файл, чтобы быть уверенным, что это правильно.

find /path/to/your/files* -ipath '*/archive/*' -type f -mtime +10 > filelist.txt 
+2

Вместо запуска одного процесса 'rm' для каждого объекта используйте' + 'терминатор вместо' \; '. Это приведет к объединению нескольких аргументов для каждого экземпляра. Ваша таблица процессов, ваш процессор и ваши пользователи оценят вас, и для большого количества файлов вы увидите большие улучшения скорости. – JRFerguson

+0

@ikegami Я добавил отсутствующий аргумент. :-) – Oliver

+0

Оливер, отлично выглядит, но похоже, что опция -ipath не поддерживается в системах AIX – clmccomas

0

Я предлагаю модуль Path::Class, который имеет traverse метод, подобный тому, как File::Find работает, но с гораздо большим удобством.

Эта программа будет осуществлять поиск по данному дереву каталогов и найти все файлы, находящиеся в папке с именем archive, и иметь время модификации в течение трех дней или более назад.

В завершении программа просто распечатает найденные файлы, соответствующие критериям. Чтобы удалить их, вы должны удалить ограничитель комментариев # из строки, содержащей $node->remove.

use strict; 
use warnings; 

use Path::Class; 

my $dir = dir '/path/to/root'; 

$dir->traverse(sub { 
    my ($node, $cont) = @_; 
    if ($node->is_dir) { 
    $cont->(); 
    } 
    elsif ($node->dir->basename eq 'archive') { 
    my $age = (time - $node->stat->mtime)/(60 * 60 * 24); 
    printf "%s %.1f days old\n", $node, $age; 
    # $node->remove if $age > 3; 
    } 
}); 
0

Это будет работать на Linux и Маках:

$ find . -name archive -type d -mtime -$X_DAYS -delete 

Однако, мое предпочтение было бы первым запустить это:

$ find . -name archive -type d -mtime -$X_DAYS -ls | tee find.out 

Это будет список файлов, которые вы думаете о удаляя и помещая их в файл с именем find.out. Вы можете посмотреть результат и убедиться, что в нем нет ничего, что может вызвать проблемы. Возможно, есть архивный каталог старше 10 дней, но вы не хотите его удалять.

Вы можете отредактировать этот файл, чтобы удалить все, что хотите сохранить. Затем вы можете запустить следующую команду:

$ awk '{print "rm -rf " $NF}' find.out | tee command.out 

Это создаст файл команд для удаления каталогов. Посмотрите на command.out и если все в порядке, то сделать это:

$ ш command.out

Почему пройти через все это rigamarole?Потому что вы хотите убедиться, что вы удаляете то, что хотите удалить, а не то, что хотите сохранить. Лучше сделайте несколько дополнительных шагов и убедитесь, что все в порядке, если вы удаляете вещи.