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

17

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

Обратите внимание, что каждый из них securityfolderNявляется отдельным пользователем.

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

Жако ван де Вейгаарт
источник
/homeобычно содержит подпапку для каждого пользователя. Если вы не хотите хранить резервные копии как разные пользователи (не очень хорошая идея), вам следует рассмотреть другое место, например, /home/security/backup1и так далее.
Мелебиус
@Melebius спасибо за ваш комментарий, каждая папка / security - это отдельный пользователь, я забыл упомянуть об этом.
Жако ван де Вейгаарт

Ответы:

27

Сначала эта команда найдет и удалит все файлы старше 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команду один раз в день и удалять файлы.

terdon
источник
+1 Вбить гвоздь немного глубже и, может быть, повторить предложение Мелебиуса OP, что find '/home/securityuser/*' -mtime +6 -type f -delete(со всеми уместными и соответствующими изменениями в создании пользователя), как правило, может быть лучшей идеей, чем find '/home/securityuser*' -mtime +6 -type f -delete(без косой черты в пути) ...?
Cbhihe
@Cbhihe нет, целевые каталоги называются /home/securityuserN, поэтому без косой черты они не будут найдены.
Тердон
да, видел это; просто не думал, что это хорошая практика со стороны OP (создание отдельного пользователя для каждого видео о безопасности и т. д.) по линии первого комментария Melebius, хотя у OP могут быть свои причины для этого. Во всяком случае, мой комментарий был хромым, а не критикой вашего хорошего и полного ответа.
Cbhihe
1
+1 От меня. Просто отметьте одну деталь, когда я выполнял это на RHEL: подстановочный знак не работал на пути. Я должен был поставить это на -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis
1
@ SteliosAdamantidis Ого, я полностью пропустил это! Да, оригинальная версия не будет работать, так как я цитировал 'securityuser*'. Подстановочный знак должен быть расширен за счет оболочки, а не за счет find, поэтому он должен был быть securityuser*(без кавычек). Смотрите обновленный ответ. Спасибо за указание на это, Стелио, я не могу поверить, что никто не заметил раньше! Ти влакас!
тердон
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и это, кажется, работает. Как я могу автоматизировать это?
Жако ван де Вейгаарт
создайте один файл сценария и запустите эту команду, используя сценарий, если он работает, чем запустите файл сценария при запуске.
Маулик Патель
я здесь как супернобец, потому что это часть создания скрипта, означает ли это файл с #!/bin/bashкодом под этим? или я действительно тупой прямо здесь?
Жако ван де Вейгаарт
2
@Melebius нет, путь не должен заключаться в кавычки, особенно если он содержит символы глобуса. Вы хотите, чтобы это было расширено оболочкой, и цитирование заблокировало бы это. Попробуйте, например: find '/u*' -name local. Это такие директивы, -name "foo*"которые должны быть заключены в кавычки, когда они содержат символы глобуса.
тердон