Як видалити файли старші X годин


191

Я пишу сценарій bash, який повинен видалити старі файли.

В даний час реалізовано за допомогою:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

Це видалить файли старше 1 дня.

Однак що робити, якщо мені потрібна точніша роздільна здатність цього дня, наприклад, 6 годин? Чи є приємний чистий спосіб це зробити, як, наприклад, використовуючи find і -mtime?

Відповіді:


303

Чи findє у вас -mminваріант? Це дозволить вам перевірити кількість хвилин після останньої модифікації:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

Або, можливо, погляньте на використання tmpwatchдля виконання тієї ж роботи. phjr також рекомендується tmpreaperв коментарях.


2
Використання --mmin + X повертає всі файли з моєю знахідкою. Моя вина, що я не перевірив це спочатку, але ця команда просто видалила більшість мого домашнього каталогу. Для мене --mmin -X - правильний аргумент.
brandones

tmpreaper - це виделка tmpwatch. Він безпечніший і існує як пакунок debian у дистрибутиві. Переваги над find -delete: tmpreaper не видалить посилання, розетки, фіфоси та спеціальні файли
Nadir

Зверніть увагу, що $ REQUIRED_FILES потрібно містити в лапках (подвійні лапки), і ви можете використовувати зразок типу: " .txt" для всіх .txt файлів або файлів, що починаються з шаблону типу: "temp- ", щоб видалити всі файли з ім'ям temp -
achasinh

@PaulDixon як змінити це так, щоб $LOCATIONі $REQUIRED_FILESобидва могли мати декілька значень, таких як dir1 dir2і *.txt *.tmp?
Еніссей

@Enissay $ LOCATION - це єдиний каталог. Для декількох розширень, можливо, ви хочете використовувати шаблон з -regex - див. Stackoverflow.com/questions/5249779/…
Пол Діксон,

9

Ви могли б зробити цю хитрість: створіть файл 1 годину тому і використовуйте -newer fileаргумент.

(Або використовуйте touch -tдля створення такого файлу).


1
немає перемикача -older (принаймні, в моїй команді find), і саме це було б потрібно. -Не допомагає.
іконоборство

чи можете ви дати сенсорну команду, яка б генерувала файл, що триває 1 годину, який буде працювати на машинах, які не можуть використовувати -mmin? (Якщо ви працюєте в Linux, -mmin доступний, якщо ні, то дата та інші команди також слабкі порівняно.)
iconoclast

2
@iconoclast touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) testСтворює файл, testякому завжди доводиться 1 годину.
rovr138

4

Ось підхід, який працював на мене (і я не бачу, що він використовується вище)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

видалення всіх файлів старше 59 хвилин, залишаючи папками недоторканими.


Краще ввести одну цитату, '*.*'або оболонка розширить її до фактичних імен файлів, а не збереже їх як підстановку для findвирішення. Це порушує findрекурсивну роботу над підкаталогами.
MestreLion

Крім того, майте на увазі , що -name '*.*'буде не видаляти файли , які не мають розширення, такі як README, Makefileі т.д.
MestreLion

1

Для SunOS 5.10

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.

0

-ммін - це хвилин.

Спробуйте переглянути сторінку чоловіка.

man find

для інших типів.


0

Якщо у вашій версії "знайти" у вас немає "-mmin", то "-mtime -0.041667" наближається до "протягом останньої години", тому у вашому випадку використовуйте:

-mtime +(X * 0.041667)

Отже, якщо X означає 6 годин, то:

find . -mtime +0.25 -ls

працює тому, що 24 години * 0,25 = 6 годин


Був сподіватися, оскільки цей старий UNIX не має -mmin, але, на жаль, це не допомагає, оскільки цей старий UNIX також не любить дробових значень для mtime: find: аргумент до -mtime повинен бути цілим числом у діапазоні від -2147483647 до 2147483647
kbulgrien

0

Ось що можна зробити для того, щоб продовжувати шлях @iconoclast цікавився у своєму коментарі до іншої відповіді.

використовувати crontab для користувача або a /etc/crontabдля створення файлу /tmp/hour:

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

а потім скористайтеся цим для запуску команди:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;

*/1щогодини є зайвим у вашому кронтабі. Це те саме, що помістити * у поле години.
colm.anseo


0

Якщо findцього немає, -mminі якщо він також застряг із тим, findщо приймає лише цілі значення для -mtime, то все не обов'язково втрачається, якщо вважати, що "старше" схоже на "не новіше".

Якщо нам вдалося створити файл, який має час моменту відключення, ми можемо попросити findзнайти файли, які не є новішими, ніж наш довідковий файл.

Щоб створити файл , який має правильний штамп часу є ускладниться , так як система , яка не має адекватний , findймовірно , також має менше, ніж здатна dateкоманду , яка може робити такі речі , як: date +%Y%m%d%H%M%S -d "6 hours ago".

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

Врахуйте, що шість годин - 21600 секунд. Ми хочемо знайти шість годин тому у корисному форматі:

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

Заява perl справді дала корисну дату, але її потрібно використовувати для кращого використання:

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

Тепер рішенням цього старого UNIX є щось таке:

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

Також може бути хорошою ідеєю очистити наш довідковий файл ...

$ rm -f ref_file
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.