Cron удалить файлы в папке старше 7 дней
I'm writing a bash script that needs to delete old files.
It's currently implemented using :
This will delete of the files older than 1 day.
However, what if I need a finer resolution that 1 day, say like 6 hours old? Is there a nice clean way to do it, like there is using find and -mtime?
9 Answers 9
Does your find have the -mmin option? That can let you test the number of mins since last modification:
Or maybe look at using tmpwatch to do the same job. phjr also recommended tmpreaper in the comments.
Using --mmin +X returns all files with my find. My fault for not checking this first, but this command just deleted most of my home directory. For me, --mmin -X is the correct argument.
tmpreaper is a fork of tmpwatch. It is safer, and exists as a debian package in the distro. Benefits over find -delete : tmpreaper will not remove symlinks, sockets, fifos, or special files
Point out that $REQUIRED_FILES need to be in quotes (double quotes) and you can use a pattern like: ".txt" for all .txt files or files beginning with a pattern like: "temp-" to delete all files named with temp-
@PaulDixon how to modify this so that $LOCATION and $REQUIRED_FILES can both have multiple values such as dir1 dir2 and *.txt *.tmp ?
Here is the approach that worked for me (and I don't see it being used above)
deleting all the files older than 59 minutes while leaving the folders intact.
Better to single-quote '*.*' or the shell will expand it to actual filenames instead of keeping it as a wildcard for find to resolve. This breaks find 's recursive operation on subdirs.
Also keep in mind that -name '*.*' will not delete files that have no extension, such as README , Makefile , etc.
You could to this trick: create a file 1 hour ago, and use the -newer file argument.
(Or use touch -t to create such a file).
there is no -older switch (at least in my find command), and that's what would be needed. -newer doesn't help.
can you give a touch command that would generate a file 1 hour old that will work on machines that can't use -mmin? (If you're on Linux, -mmin is available, if not then date and other commands are also feeble in comparison.)
@iconoclast touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) test Creates file test that's always 1 hour old.
To rm files and directories older than file.ext run rm -r `find -maxdepth 1 -not -newer file.ext` . To rm files and directories newer than file.ext do rm -r `find -maxdepth 1 -newer file.ext` . To place file.ext where you want it in time run touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) file.ext where '-1 hour' specifies "1 hour ago". Credit: xoftl, rovr138, nickf.
-mmin is for minutes.
Try looking at the man page.
If one's find does not have -mmin and if one also is stuck with a find that accepts only integer values for -mtime , then all is not necessarily lost if one considers that "older than" is similar to "not newer than".
If we were able to create a file that that has an mtime of our cut-off time, we can ask find to locate the files that are "not newer than" our reference file.
To create a file that has the correct time stamp is a bit involved because a system that doesn't have an adequate find probably also has a less-than-capable date command that could do things like: date +%Y%m%d%H%M%S -d "6 hours ago" .
Fortunately, other old tools can manage this, albeit in a more unwieldy way.
To begin finding a way to delete files that are over six hours old, we first have to find the time that is six hours ago. Consider that six hours is 21600 seconds:
Since the perl statement produces the date/time information we need, use it to create a reference file that is exactly six hours old:
Now that we have a reference file exactly six hours old, the "old UNIX" solution for "delete all files older than six hours" becomes something along the lines of:
Удаление старых файлов в Linux является типовой задачей, обычно это однотипные старые файлы — логи или файлы сессий РНР. Если система их ротирования, сжатия и удаления не настроена оптимально логи могут занимать значительное пространство, если же свободного места на сервере остается меньше 10% в его работе могут наблюдаться трудности.
Удаление старых файлов linux по маске чаще всего осуществляется следующим образом:
Веб-сервер указан для примера. Синтаксис очень прост — команда принудительно удалит все файлы с расширением .log в указанном каталоге, при этом удаление будет рекурсивным(-r — recursive) и подтверждения система при этом спрашивать не будет (-f — force).
При удалении таким образом очень большого количества файлов из определенного каталога может выдавать ошибки — причина в том, что система на самом деле не видит маски и разворачивает передаваемое ей выражение — срабатывает ограничение на количество аргументов, и выполнение команды прекращается.
Если rm -rf не помогает — удалять файлы следует в цикле for. Для каждого файла будет отдельная операция удаления и никаких ограничений системы здесь ожидать не приходится.
Синтаксис в простейшем случае может выглядеть так:
for f in /var/log/apache2/*.log; do rm «$f»; done
В цикл for можно добавить любую дополнительную логику.
Удаление старых файлов в Linux по Cron
Логи или другие файлы (сессии РНР) можно удалять как используя циклы (так приходится делать обычно если логов или других файлов накопилось действительно очень много), но если система не запущена или только создается лучше использовать регулярно выполняемое задание Cron, согласно которому с заданной периодичностью будут удаляться файлы определенных типов
В примере удаляются сессии РНР для сайта старше 7 дней.
В цикле то же самое можно сделать так:
for f in /tmp/logs/*.log
Приведенное выражение, как и любой другой цикл можно поместить в файл, сделать его исполняемым и с тем же успехом выполнять по Cron
Как найти и удалить файлы старше конкретной даты в Linux
Хочу в этой теме «Как найти и удалить файлы старше конкретной даты в Linux» рассказать как можно найти и удалить определенные файлы по дате в ОС Linux таких как Debian, Ubuntu или Redhat, Centos. На готовых примера покажу что и как нужно делать.
1. Посмотрим список всех файлов в папке с датой изменения, для этого стоит выполнить команду:
пример использование команды ls -lah для вывода подробной информации о файлах
2. Чтобы узнать сегодняшнюю дату, нужно выполнить:
4. Допустим нужно найти файлы и удалить их по определенной дате.
Если нужно найти все файлы свыше 3 дня и после чего удалить их:
Если нужно найти все файлы свыше 90 дней и после чего удалить их:
Если нужно найти все файлы свыше 365 дней и после чего удалить их:
Если нужно найти все файлы свыше 100 дней и после чего удалить их:
Удаление файлов старше N дней
можно еще вот так:
Ключи:
-name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки.
-type — тип искомого: f=файл, d=каталог, l=ссылка (link).
-user — владелец: имя пользователя или UID.
-group — владелец: группа пользователя или GID.
-perm — указываются права доступа.
-size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).
-atime — время последнего обращения к файлу.
-ctime — время последнего изменения владельца или прав доступа к файлу.
-mtime — время последнего изменения файла.
-newer другой_файл — искать файлы созданные позже, чем другой_файл.
-delete — удалять найденные файлы.
-ls — генерирует вывод как команда ls -dgils.
-print — показывает на экране найденные файлы.
-exec command <> \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис.
-ok — перед выполнением команды указанной в -exec, выдаёт запрос.
-depth — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.
-prune — используется, когда вы хотите исключить из поиска определённые каталоги.
N — количество дней.
Я хочу удалить папку и ее содержимое на моем хосте, если ей больше суток. Проблема в том, что у меня нет опыта, как это сделать с помощью linux cron. Я должен также сказать, что я посмотрел в Google, и ничего не вышло. Я думаю, что это довольно простой вопрос, поэтому, пожалуйста, помогите мне. Спасибо
Если бы я сделал find /path/to/files* -type d -mtime +5 -exec rm <> \; это, удалил бы это папку и ее содержимое?
Это должно сделать это:
Но будьте осторожны и сначала протестируйте его снаружи cron , без -exec части, чтобы случайно не удалить что-то еще.
@KronoFiles, который действительно зависит от вашего хостинг-провайдера. Если команда имеет вывод в cron, то cron обычно отправляет результат для использования по электронной почте. Вы можете запустить find public_html/website без каких-либо других аргументов, чтобы распечатать все файлы и подкаталоги там, и это должно быть отправлено вам по электронной почте. Основываясь на этом выводе, вы можете определить правильный путь для использования.
Есть ли какой-нибудь веб-сайт, где я мог бы узнать об этом больше? Мне сейчас действительно интересно.
Сначала посмотрите, какие файлы будут удалены:
Затем, когда все будет готово к выполнению:
Я предполагаю, что вы хотите удалить папку со всем ее содержимым, как только самый новый файл в этой папке не был изменен в течение последних 24 часов.
Вот одно решение, наверное, не самое элегантное:
Во-первых, используйте эту команду, чтобы удалить все файлы, отметка времени модификации которых старше 24 часов:
Затем попробуйте удалить все папки в вашей папке, включая саму папку:
Это приведет к удалению только тех папок, которые не содержат файлов. То есть, если файлы остаются после первого шага (поскольку их временная метка модификации не старше 24 часов), то ваша папка (возможно, с подпапками) останется. Если cronjob запускается повторно, то в какой-то момент времени - как только в вашей папке не останется файл моложе 24 часов - ваша папка и все ее содержимое будут удалены.
Вы можете поместить это в файл /etc/cron.d/folder-cleanup следующим образом:
Таким образом, процесс очистки будет выполняться каждые 5 минут.
Обратной стороной этого подхода является то, что ваша папка постепенно исчезнет. Я не уверен, что это то, что вам нужно.
Файловые системы Unix / Linux имеют три типа отметок времени для каждого файла. Они заключаются в следующем:
- Время доступа (-atime): отметка времени последнего обращения к файлу.
- Время изменения (-mtime): отметка времени последнего изменения файла.
- Время изменения (-ctime): отметка времени последнего изменения метаданных для файла (например, прав доступа или владельца).
Поиск и удаление файла старше 7 дней
Давайте рассмотрим пример, в котором мы найдем и удалим файл старше 7 дней.
Для этого мы будем использовать опцию «-mtime» команды find.
2. Если имена файлов начинаются с какого-либо конкретного шаблона, отфильтруйте его следующим образом:
3. После проверки и подтверждения вывода, перейдите к скрипту удаления (это очень важно), в противном случае произойдет безвозвратная потеря данных.
4. Если это необходимо сделать на удаленном сервере через задание cron и зарегистрировать имена удаленных файлов, используйте следующую команду
Заключение
Параметр -mtime будет искать файлы по времени модификации; время поиска в зависимости от времени изменения.
Время использования -atime, -mtime и -ctime измеряется в днях.
Команда find также поддерживает параметры, измеряемые в минутах.
-амин (время доступа)
-mmin (время модификации)
-cmin (изменить время)
Например, чтобы вывести все файлы со временем доступа более семи минут, используйте следующую команду:
Опция -newer
Опция -newer указывает эталонный файл со временем модификации, который будет использоваться для выбора файлов, измененных раньше, чем эталонный файл.
Найдите все файлы, которые были изменены совсем раньше, чем файл file.txt:
Добавить комментарий Отменить ответ
Эта простая однострочная программа для Powershell выведет текущее время работы вашего компьютера. Вывод показан в несколько столбцов, но может быть выведен и в одну строку. PS C:\Users\Windows 11> (get-date) - (gcim Win32_OperatingSystem).LastBootUpTime Days : 0 Hours : 0 Minutes : 41 Seconds : 27 Milliseconds : 915 Ticks : 24879150105 TotalDays : 0.0287953126215278.
Ошибка 504 gateway time-out возникает тогда, когда Nginx не может получить ответ от службы достаточно долго. Например, от PHP-FPM. Nginx и PHP-FPM Наиболее распространенной причиной этой ошибки является совместная работа Nginx и PHP-FPM. В случае очень медленных PHP-скриптов Nginx выдает тайм-аут шлюза 504, когда не ожидает ответа в течение 30 секунд (по умолчанию). Чтобы избавиться.
17 сентября 2021 года произошло событие, всколыхнувшее кинематографический мир. На платформе Netflix появился корейский сериал “Игра в кальмара”. Всего пары недель ему хватило для того, чтобы выйти на первые позиции по популярности не только на Родине, но и в Соединенных Штатах, России. Оценить сюжет сериал можно не только просмотром, но и игрой squid game challenge скачать которую.
Читайте также: