Я пишу нижче команду, щоб видалити всі файли, старші 7 днів, але це не працює:
find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;
Як я можу видалити ці файли?
Я пишу нижче команду, щоб видалити всі файли, старші 7 днів, але це не працює:
find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;
Як я можу видалити ці файли?
Відповіді:
Як @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
-deleteу кінці не піти прямо ? Чому возитися з +або \;?
Будьте обережні, видаляючи файли з пошуку. Виконайте команду з -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 {} \;
nameі'*.gz'.