Як знайти та видалити файли, старші за певні дні в 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

Це не буде працювати з файлами з пробілами в них.
Drav Sloan

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