Я пишу ниже команду, чтобы удалить все файлы старше 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 Ī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
-delete
в конце? Зачем связываться с +
или \;
?
Будьте осторожны, удаляя файлы с помощью 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 {} \;
name
и'*.gz'
.