Как найти и удалить файлы старше определенных дней в Unix?


38

У меня есть одна папка для журнала с 7 папками в нем. В этих семи папках тоже есть подпапки, и в этих подпапках тоже есть подпапки. Я хочу удалить все файлы старше 15 дней во всех папках, включая подпапки, не затрагивая структуру папок, то есть только файлы.

mahesh@inl00720:/var/dtpdev/tmp/ > ls
A1  A2  A3  A4  A5  A6  A7

mahesh@inl00720:/var/dtpdev/tmp/A1/ > ls
B1 B2 B3 B4 file1.txt file2.csv

Ответы:


54

Вы могли бы начать, сказав find /var/dtpdev/tmp/ -type f -mtime +15. При этом будут найдены все файлы старше 15 дней и напечатаны их имена. При желании вы можете указать -printв конце команды, но это действие по умолчанию. Желательно сначала выполнить вышеуказанную команду, чтобы увидеть, какие файлы выбраны.

После того, как вы убедитесь, что findкоманда выводит список файлов, которые вы хотите удалить (и никаких других), вы можете добавить «действие» для удаления файлов. Типичные действия для этого:

  1. -exec rm -f {} \;(или, что то же самое -exec rm -f {} ';')
    Это будет выполняться rm -fдля каждого файла; например,

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
    
  2. -exec rm -f {} +
    Это будет работать rm -fна многих файлах одновременно; например,

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
    

    поэтому он может быть немного быстрее, чем вариант 1. (Может потребоваться запустить rm -fнесколько раз, если у вас есть тысячи файлов.)

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

Итак, если вы используете вариант 2, вся команда будет выглядеть так:

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +

Использовать -delete проще (синтаксис и никакие дочерние процессы не создаются для удаления), но может работать не во всех системах. rm -f {} + лучше всего, он будет удалять файлы в пакетном режиме, если файлов будет достаточно для одной командной строки. rm -f {} ';' выдаст команду слишком длинную ошибку, если файлов будет достаточно для одной командной строки.
gaoithe

-1

Или сделать это с помощью цикла:

for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done

Это не будет работать с файлами с пробелами в них.
Драв Слоан,

Вместо этого вы можете использовать цикл while, который должен заботиться о файлах с пробелами. find / var / dtpdev / tmp / -type f -mtime +15 | пока читаю х; do rm "$ x"; сделано
Дэвид Окви
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.