Автоматичне видалення файлів старше 7 днів


17

Я повний ноб у Linux, але я починаю вивішувати це. У мене є Ubuntu Server 16.04, на якому працює FTP-сервер для резервного копіювання відеофайлів безпеки. Файли будуть збережені в папках , як: /home/securityfolder1, /home/securityfolder2, /home/securityfolder3і так далі.

Зауважте, що кожен securityfolderN- це інший користувач.

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


/homeзазвичай містить підпапку для кожного користувача. Якщо ви не хочете зберігати свої резервні копії як різних користувачів (не дуже гарна ідея), вам слід розглянути інше місце, наприклад, /home/security/backup1тощо.
Мелебій

@Melebius дякую за ваш коментар, кожен / папка безпеки - це інший користувач, я забув це згадати.
Жако ван де Віджгарт

Відповіді:


28

По-перше, ця команда знайде та видалить усі файли старші 7 днів у будь-якому підкаталозі /home, ім'я якого починається з securityuser:

find /home/securityuser* -mtime +6 -type f -delete

Вам потрібно, -mtime +6а не +7тому, що -mtimeнараховує 24 години. Як пояснено в -atimeрозділі man find( -mtimeпрацює аналогічно):

   -atime n
          File  was  last  accessed n*24 hours ago.  When find figures out
          how many 24-hour periods ago the file  was  last  accessed,  any
          fractional part is ignored, so to match -atime +1, a file has to
          have been accessed at least two days ago.

Отже, щоб знайти файл, який було змінено 7 і більше днів тому, вам потрібно знайти файли, які були змінені більше 6 днів тому -mtime +6.

Наступним кроком є ​​виконання цієї команди раз на день. Оскільки кожен securityuserNє іншим користувачем (можливо, ви хочете переосмислити цю установку, це все ускладнює), це потрібно запустити як root. Отже, редагуйте /etc/crontab:

sudo nano /etc/crontab

І додайте цей рядок:

@daily root find /home/securityuser* -mtime +6 -type f -delete

Це запустить findкоманду раз на день та видалить файли.


+1 Забивати цвях трохи глибше і, можливо, повторювати пропозицію Мелебія до ОП, що find '/home/securityuser/*' -mtime +6 -type f -delete(з усіма відповідними і відповідними змінами у створенні користувача), як правило, може бути кращою ідеєю, ніж find '/home/securityuser*' -mtime +6 -type f -delete(відсутність косого шляху) ...?
Cbhihe

@Cbhihe ні, цільові каталоги викликаються /home/securityuserN, тому без косої риски їх не буде знайдено.
тердон

юп, бачив це; просто не вважав це доброю практикою з боку ОП (створення окремого користувача для кожного відеозапису про безпеку тощо), відповідно до першого коментаря Мелебія, навіть якщо ОП може мати свої причини для цього. Якщо що-небудь мій коментар був кульгавим, а не критикою вашої доброї та повної відповіді.
Cbhihe

1
+1 Від мене. Просто зауважте одну деталь, коли я виконував це на RHEL: макіяж не працював на шляху. Мені довелося викласти це -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios

1
@ SteliosAdamantidis о, ух, я повністю пропустив це! Так, оригінальна версія не працювала б з моменту цитування 'securityuser*'. Підстановочна карта повинна бути розширена оболонкою, а не на findтак, так і повинно бути securityuser*(без лапок). Дивіться оновлену відповідь. Дякую, що ви вказали на це, Стеліо, я не можу повірити, що ніхто раніше цього не помічав! Ti vlakas!
тердон

4

як я знаю:

спробуйте findкоманду так:

find ./dirc/* -mtime +6 -type f -delete

./dirc/* : is your directory (Path)
-mtime +6 : modified more than 6 days ago (therefore, at least 7 days ago)
-type f : only files
-delete : no surprise. Remove it to test before like rm

Спасибі за вашу відповідь. Чи означає ./dirc/* означає: ./home/securityfolder1/* чи це неправильно?
Жакко ван де Віджгарт

Я просто спробував це у моєму віртуальному ящику, find /home/jacco/ -mtime +1 -type f -deleteі, здається, він працює. Як я можу це автоматизувати?
Жако ван де Віджгарт

Створіть один файл сценарію та запустіть цю команду за допомогою скрипту, якщо він працює, ніж запустіть файл сценарію під час запуску.
Maulik Patel

я як суперноб тут, тому що частина створення сценарію, це означає файл з #!/bin/bashкодом під цим? чи я справді дурний тут?
Жакко ван де Віджгарт

2
@Melebius ні, шлях не слід цитувати, особливо коли містяться глобальні символи. Ви хочете, щоб вона була розширена оболонкою, і цитування заблокувало б це. Спробуйте, наприклад: find '/u*' -name local. Такі директиви -name "foo*"слід цитувати, коли містяться символи глобуса.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.