Как заставить мою систему удалить все файлы в определенном каталоге старше определенного времени, сохраняя структуру каталога нетронутой?

12

У меня есть каталог на моей машине, я думаю, что это мой собственный tmpкаталог, но он находится в моем ~каталоге. И я хочу сделать так, чтобы моя система каждые 3 часа удаляла все файлы (хотя сохраняя любую структуру каталогов, но все же рекурсивно удаляя все файлы на всех уровнях каталогов) в том каталоге, который старше одного дня.

Я использую Ubuntu GNOME 15.10 с GNOME 3.18, это можно сделать? И если да, то как? Я хотел бы, чтобы это было полностью автоматизировано без взаимодействия с пользователем. Это должно быть что-то автоматически запускаемое при входе в систему, поэтому мне не нужно запускать что-либо при каждом запуске.


источник

Ответы:

21

Использование find:

find ~/tmp -type f -mtime +0 -delete
  • ~/tmp каталог для поиска рекурсивно, измените его соответственно

  • -type f будет искать только файлы

  • -mtime +0 который будет соответствовать файлу, если он был последний раз изменен один день или более назад

  • -delete просто удалит соответствующие файлы

Здесь выгода -mtime +0, большинство может подумать об использовании, -mtime +1но findбудет игнорировать любое дробное время при расчете дней. Таким образом, -mtime +1будет соответствовать файл, если последняя модификация была сделана как минимум 2 дня назад.

Цитирование man find, -mtimeимеет то же соглашение о сроках, что и -atime:

-платец

Последний раз к файлу обращались n * 24 часа назад. Когда команда find выясняет, сколько 24-часовых периодов назад к файлу последний раз обращались, любая дробная часть игнорируется, поэтому для соответствия -atime +1 файл должен был быть получен как минимум два дня назад.

Также обратите внимание, что если вам нужна точность, вы должны -mminвыбрать опцию findдля указания времени в минутах.

Чтобы запустить его периодически через 3 часа, вы можете добавить cronзапись.

Запустите crontab -eи добавьте:

00 */3 * * * /usr/bin/find ~/tmp -type f -mtime +0 -delete

Использование zshдля удаления файлов:

rm ~/tmp/**/*(.-m+0)

Добавление к cron:

00 */3 * * * /usr/bin/zsh -c 'rm ~/tmp/**/*(.-m+0)'
heemayl
источник
6

Вы должны иметь возможность удалить все файлы старше 1 дня /home/username/directoryи все каталоги под ним с помощью:

find /home/username/directory -type f -mtime +1 -delete

И чтобы запланировать эту команду каждые три часа, установите ее как задание cron:

crontab -e

Тогда внутри crontab:

0 */3 * * * find /home/username/directory -type f -mtime +1 -delete

Который запускает вашу команду каждые три часа в час (то есть минута 0), то есть 3:00 утра, 6:00 утра и т. Д.

Перейти к cronи crontab manpagesдля получения дополнительной информации о них.

Limecat
источник
4
Этот ответ на самом деле неправильный, пожалуйста, смотрите другой ответ .
4
Поскольку этот ответ неверен и на самом деле не говорит ничего больше, чем другой ответ, пожалуйста, улучшите свой ответ, чтобы он был правильным и лучше, чем другой ответ, или удалите его.
5
@ParanoidPanda Я понимаю, что вы хотите получить качественные ответы, но комментировать, по сути, одно и то же дважды, не нужно, и это может показаться агрессивным, особенно для нового пользователя.
RPiAwesomeness
2
@RPiAwesomeness: Ну, я прокомментировал второй раз, потому что у меня не хватило времени, чтобы отредактировать свой первый комментарий, и я также хотел сказать, что они должны удалить свой ответ, который, возможно, не обязательно был понят из моего первого комментария, хотя я Я не хотел, чтобы они чувствовали себя под атакой, и, как я только что сказал, они дали неправильный ответ и теперь должны удалить его, поэтому я добавил немного об улучшении. Но я могу понять, как это можно понять неправильно, поэтому я прошу вас помнить: Панда становится агрессивным, только когда вы убираете его бамбук. ;-)