36

Я пытаюсь удалить тонну файлов старше x дней.

Теперь у меня есть скрипт для этого

find /path/to/files* -mtime +10 -exec rm {} \; 

Но это также удалит подкаталоги. Существует множество папок, но я хотел бы сохранить их и удалить файлы старше 10 дней из указанных папок.

Есть ли способ сделать это?

6 ответов6

50

опция type для фильтрации результатов

find принимает опцию type для выбора, например, только файлов.

find /path/to/files -type f -mtime +10 -delete

Не указывайте параметр -delete чтобы показать, что он будет удалять, и после того, как вы это проверите, продолжайте и выполните полную команду.

Это будет работать только на файлы, а не каталоги. Используйте -type d для обратного, перечисляя только те каталоги, которые соответствуют вашим аргументам.


Дополнительные опции

Возможно, вы захотите прочитать man find , так как есть еще несколько вариантов, которые вам могут понадобиться в будущем. Например, -maxdepth позволит вам ограничить только найденные элементы определенной глубиной, например, -maxdepth 0 не вернется в подкаталоги.

Некоторые замечания

  • Интересно, как команда удалила папку, так как вы не можете удалить папку только с помощью rm . Для этого вам понадобится rm -r .

  • Кроме того, /path/to/files* сбивает с толку. Вы имели в виду /path/to/files/ или ожидаете, что подстановочный знак расширится до нескольких имен файлов и папок?

  • Поместите {} в одинарные кавычки, то есть '{}' чтобы избежать интерпретации замещенного имени файла / каталога оболочкой, как мы защищаем точку с запятой обратной косой чертой.

5

Как и в предыдущих ответах (+1 для обоих), хитрость заключается в использовании предиката -type f .

Обратите внимание, что вместо -exec rm '{}' вы также можете использовать предикат -delete . Но не делай этого. С -exec rm '{}' вы можете (и должны) сначала выполнить -exec echo rm '{}' чтобы убедиться, что это именно то, что вам нужно. После этого повторите команду без echo .

Использование -delete выполняется быстрее (без дополнительных fork() и execve() для каждого файла), но это рискованно, поскольку -delete также работает как условие, поэтому:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

но если вы ТОЛЬКО меняете аргументы:

# delete ALL files
find . -type f -name '*.tmp' -delete

Если вам когда-нибудь понадобится find и rm для более быстрой работы с множеством файлов, проверьте find ... | xargs ... rm идиома UNIX.

1

Вы можете легко сделать это с помощью команды find

$ find -type f

Что ограничивает результаты, чтобы иметь тип файла

1

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

В конце концов наткнулся на tmpreaper, и до сих пор он работал довольно хорошо для нас.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Исходная ссылка

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

0

Для ускорения команды используйте '+' вместо \;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

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

0

rm -f find /path/to/files -type file -mtime -5

Это удалит файлы, которые были изменены в течение 5 дней

rm -f find /path/to/files -type file -mtime +5

Это удалит файлы, которые были изменены ранее 5 дней

Используйте `перед поиском и в конце после 5.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .