Видалення файлів старше 7 днів


79

Я пишу нижче команду, щоб видалити всі файли, старші 7 днів, але це не працює:

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

Як я можу видалити ці файли?


5
Там повинно бути простір між nameі '*.gz'.
Джос

Відповіді:


136

Як @Jos вказав, ви пропустили пробіл між nameі '*.gz'; також для прискорення -type fпараметра використання команди для запуску команди лише на f iles.

Отже, фіксованою командою було б:

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

Пояснення:

  • find: команда unix для знаходження чорнила f iles / d irectories / l та ін.
  • /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

3
Чому б -deleteу кінці не піти прямо ? Чому возитися з +або \;?
дощ01

3
@ rain01 plz читати unix.stackexchange.com/q/167823/72456
αғsnιη

2

Будьте обережні, видаляючи файли з пошуку. Виконайте команду з -ls, щоб перевірити, що ви видаляєте

find /media/bkfolder/ -mtime +7 -name '*.gz' -ls . Потім витягніть команду з історії та додайте-exec rm {} \;

Обмежте збиток, який може зробити команда find. Якщо ви хочете видалити файли лише з одного каталогу, -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 {} \;

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.