Удаление файлов старше 7 дней

80

Я пишу ниже команду, чтобы удалить все файлы старше 7 дней, но она не работает:

find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;

Как я могу удалить эти файлы?

Малихэ Пакьяри
источник
5
Там должно быть пространство между nameи '*.gz'.
Йос

Ответы:

137

Как заметил @Jos, вы пропустили пробел между nameи '*.gz'; также для ускорения использования команды -type fвозможности запуска команды на F Īles только.

Таким образом, фиксированная команда будет:

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

Объяснение:

  • find: Команда Unix для нахождения F ILES / d irectories / л чернил и т.д.
  • /path/to/: каталог для начала поиска.
  • -type f: только найти файлы.
  • -name '*.gz': список файлов, который заканчивается на .gz.
  • -mtime +7: учитывать только те, у которых время модификации старше 7 дней.
  • -execdir ... \;: для каждого найденного результата выполните следующую команду в ....
  • rm -- '{}': удалить файл; {}часть, где результат находка получает подставляется из предыдущей части. --означает, что в конце параметров команды исключается ошибка запроса для тех файлов, которые начинаются с дефиса .

В качестве альтернативы используйте:

find /path/to/ -type f -mtime +7 -name '*.gz' -print0 | xargs -r0 rm --

От человека найти :

-print0 
      True; print the full file name on the standard output, followed by a null character 
  (instead of the newline character that -print uses). This allows file names that contain
  newlines or other types of white space to be correctly interpreted by programs that process
  the find output. This option corresponds to the -0 option of xargs.

Что немного более эффективно, потому что это составляет:

rm file1 file2 file3 ...

в отличие от:

rm file1; rm file2; rm file3; ...

как в -execметоде.


Альтернативная и более быстрая команда использует +терминатор exec вместо\; :

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' +

Эта команда будет выполняться rmтолько один раз в конце, а не каждый раз, когда файл будет найден, и эта команда почти такая же быстрая, как при использовании -deleteопции, как в современной версии find:

find /path/to/ -type f -mtime +7 -name '*.gz' -delete
αғsнιη
источник
3
Почему бы мне не пойти прямо -deleteв конце? Зачем связываться с +или \;?
rain01
3
@ rain01, пожалуйста, прочитайте unix.stackexchange.com/q/167823/72456
αғsнιη
3

Будьте осторожны, удаляя файлы с помощью find. Запустите команду с -ls, чтобы проверить, что вы удаляете

find /media/bkfolder/ -mtime +7 -name '*.gz' -ls , Затем вытащи команду из истории и добавь-exec rm {} \;

Ограничьте урон, который может сделать команда поиска. Если вы хотите удалить файлы только из одного каталога, -maxdepth 1то при поиске опечатка не сможет пройти по подкаталогам или выполнить поиск по всей системе /media/bkfolder /.

Другие ограничения, которые я добавляю, - это более конкретные аргументы имени, такие как -name 'wncw*.gz'добавление времени новее -mtime -31и цитирование искомых каталогов. Это особенно важно, если вы автоматизируете очистку.

find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;

Зик
источник