Linux удалить файлы старше n дней

Обновлено: 08.07.2024

При обмене отдельными файлами или файлами, организованными в папки, непременно возникает вопрос своевременного их удаления как устаревших или потерявших актуальность. Как правило, респонденты не удаляют предоставленные им данные: нет времени, потом, забыл(а) . В итоге время нахождения контента в папках обмена начинает стремиться к бесконечности. Действительно, чего волноваться? Диски нынче большие, места хватает .

Описанный ниже вариант используется в целях "найти и удалить контент старше N дней" в папках общего доступа таких ресурсов как Диск Яндекс, Dropbox, MEGA, pCloud. При этом каждая папка имеет свои настройки времени хранения контента, при превышении которого он подлежит удалению.

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

Итак, обмен с использованием 5 ресурсов облачного хранения: 4 Яндекс Диска и 1 Dropbox. В каждом их них создана папка общего доступа.

Удалить файлы/папки старше N дней

Удаление устаревших файлов и папок осуществляется в ходе задания, запускаемого через cron, то есть без участия пользователя. В процессе выполнения задания создаются файлы отчётов - списка удалённого контента. При этом в имени файла отчёта содержится дата его создания. Файлы отчётов также подлежат удалению через определённое время (X дней).

Указанные выше операции осуществляются в ходе запуска и работы соответствующих клиентов синхронизации. Но их можно оформить и отдельно. В таком случае изменения в папках общего доступа будут переданы на облачные ресурсы в процессе очередного запуска сеансов синхронизации. Выбор варианта зависит от предпочтений пользователя.

Примечание 2. В силу особенностей запуска по расписанию клиентов pCloud и MEGA удаление в них файлов/папок старше N дней необходимо производить перед выполнением остановки клиента. Про остановку клиента читать здесь и здесь.

Объясняется это тем, что после запуска pcloud и megasync выполнение последующих за ними команд невозможно до тех пор, пока pcloud или megasync активны. А после выключения процессов pcloud или megasync нет синхронизации и, соответственно, передачи изменений в облако.

При создании скриптов было принято решение использовать так называемый модульный принцип, при котором в ходе работы скриптов, осуществляющих запуск и остановку клиентов, выполняются скрипты "очистки". Другими словами. были использованы скрипты в скриптах.

Скрипт очистки использует инструкции "если A, то B и если не А, то С".

if <запрос на соответствие условию>
then <действие 1>
else <действие 2>
fi

Самым первым действием является определения наличия какого-либо контента в папке обмена. Потому что если в ней ничего нет, то и дальнейшие действия не имеют смысла. Поэтому ищем файлы (а соответственно, будут найдены и папки, в которых они содержатся).

Перед выполнением указываются расположение папки для поиска (DIR1) и расположение папки отчётов (DIR2). DIR1 и DIR2 используются для того, чтобы в скрипте не писать каждый раз пути к папкам, заменяя их указанными переменными. Имена DIR1 и DIR2 указаны для примера. Для лучшего восприятия своих скриптов примените понятные Вам имена.

Формулировка условия описывается переменной filecount.

Команда "ничего не делать" соответствует символу двоеточия, то есть : .

DIR1=/home/user/Exchange/Beatrice
DIR2=/home/user/Exchange/Reports
filecount=`find $DIR1 -type f | wc -l`
if [ $filecount -eq 0 ];
then
:

Если же какие-то файлы присутствуют, то выполняется ряд последовательных операций:

else
date=`date '+%d'`
find $DIR1 -mtime +N > $DIR2/$date.Beatrice.txt
find $DIR1 -mtime +N -delete
fi

Примечание 3.

Примечание 4.
Имеется несколько вариантов команды удаления:


find /path -mtime +N -exec rm -rf <> \;

find /path -type f -mtime +N | xargs rm -rf

find /path -mtime +N -delete

В средней команде указан поиск файлов: -type f Для папок вводить -type d

На одном из форумов было найдено, что -delete работать будет быстрее. Так как лично мне была более понятна команда -delete, то она и приводится во всех указанных ниже листингах команд.

Уточнение для Dropbox и MEGA. В папках общего доступа таких клиентов могут находиться скрытый файл .dropbox или папка .debris Поэтому целесообразно исключить их из удаления, добавив инструкцию "кроме".

find $DIR1 ! -name '.dropbox' -mtime +N -delete или

find $DIR1 ! -name '.debris' -mtime +N -delete

Примечание 5.

При использовании параметра +N Вы можете быть удивлены тем, что контент будет удалён не через N дней, а позднее. Это связано в тем, что аргумент -mtime интерпретируется как количество целых дней. То есть, -mtime +N означает строго больше , -mtime -N означает строго меньше. Другими словами, если возраст объекта составляет 1 день, 23 часа, 59 минут и 59 секунд, то -mtime +1 обрабатывает его, как будто это 1 день, 0 часов, 0 минут. Связано с особенностями программной реализации.

В итоге получается, что -mtime +1 выбирает файлы, которые были изменены как минимум 2 дня назад. Чтобы получить файлы, измененные не менее 1 дня назад, используйте -mtime +0

Если необходимо указывать минуты, то используется -mmin N, что соответствует утверждению "данные файлы последний раз изменены N минут назад.

Примечание 6.

Для использования других параметров ниже приводится краткая справка.

atime означает время доступа. Эта временная метка сообщает, когда последний раз обращались к файлу. Изменяется, если использовались cat, vim, less или какой-либо другой инструмент для чтения или отображения содержимого файла.

mtime означает время изменения (модификации). Означает, что содержимое файла было изменено путем редактирования файла. При копировании или переносе в другое место хранения это значение не изменяется.

ctime означает время изменения статуса. Эта временная метка сообщает, когда был последний раз были изменены свойства и метаданные файла. Метаданные включают права доступа, права собственности, имя и местоположение файла.

Как просмотреть временные метки файла? Командой stat . Пример:

Как узнать, когда был изначально создан файл?

Смотреть inode можно двумя способами:

Ожидается, что в результате выполнения find $DIR1 -mtime +N -delete будут найдены и удалены все объекты старше N дней. Однако, как говорят, "гладко было на бумаге, да забыли про овраги".

Также в ходе тестирования имели место случаи, когда после удаления файлов из папок с составными именами сами папки не были удалены:



В этом случае можно использовать условие "посчитаем пустые папки". Если ничего не будет найдено, то ничего и не делаем. Если что-то найдём, то удалим. При этом исключим из удаления саму папку общего доступа (в рассматриваемом случае Beatrice), так как было несколько случаев удаления подобной папки, не содержащей уже никаких данных.

dircount=`find $DIR1 -type d -empty | wc -l`
if [ $dircount -eq 0 ];
then
:
else
find $DIR1 ! -name 'Beatrice' -empty -delete
fi

Аналогичные описанным выше действия применяются и для файлов отчётов. То есть используется алгоритм:

filecount=`find $DIR2 -name *.Beatrice.txt -mtime +X | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $R -name *.Beatrice.txt -mtime +X -delete
fi

Следует отметить, что файл отчёта будет создаваться всегда. Если никаких объектов для удаления не назначено, то такой файл будет пустым. Следовательно, во избежание "замусоривания" папки отчётов такие файлы необходимо найти и удалить.

filecount=`find $DIR2 -name *.Beatrice.txt -empty | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $R -name *.Beatrice.txt -empty -delete

Завершить выполнение скрипта командой exit

Итого, полный текст скрипта будет иметь вид:

Оформите как исполняемый файл. Например, clean или clean.sh. Принципиального значения наличие/отсутствие расширения не имеет. Важно лишь то, чтобы такой файл был исполняемым.

Примечание 7. На практике в Linux Mint 19 xfce через свойства файла в менеджере файлов Thunmar файлам без расширения (скриптам) не удавалось установить "исполняемый". В таком случае его можно переименовать из, например, clenan в clean.sh, назначить его исполняемым, а затем переименовать его обратно в clean. "Исполняемость" файла сохранится.

В случае отсутствия необходимости создания файлов отчётов и их последующего удаления через X дней приведенный выше текст скрипта упрощается до вида:

Примечание 8. Не забывайте про особенность общих папок в Dropbox и MEGA. Добавляйте для них исключения .dropbox и .debris (см. выше).

Запустить клиент и удалить папки/файлы старше N дней

Запуск клиента Диска Яндекс

Поясняющие подробности можно прочитать здесь. Приводится только пример скрипта.

Примечание 9.

После старта клиента Диска Яндекс (yandex-disk start) даётся время на запуск клиента и его соединение с облаком (sleep 60). Затем осуществляется очистка. После этого даётся 4 минуты на приём/передачу данных (sleep 240), после чего следует команда остановки клиента и завершения работы скрипта. 60 секунд и 240 секунд указаны условно. Пользователь сам определяет сколько времени должно пройти и следует ли ему использовать первое ожидание (sleep 60).

Если на Диске Яндекс больше чем 1 папка обмена, то тогда на каждую папку создаётся свой скрипт. Они, соответственно, должны быть запущены один за другим, например:

/home/user/scripts/clean-1
/home/user/scripts/clean-2
/home/user/scripts/clean-3

Ожидание 5 секунд после команды остановки Диска Яндекс введено "на всякий случай", чтобы гарантировать остановку клиента с используемой конфигураций. Это обусловлено тем, что у меня последовательно другом за другом запускаются 4 Диска Яндекс, каждый со своими настройками.

Если у Вас только 1 учётная запись Диска Яндекса, то нет необходимости переписывать конфигурацию клиента. Скрипт упрощается до вида:

Запуск клиента Dropbox

Скрипт запуска клиентов с очисткой

Например, у меня оформлен запуск 5-ти клиентов последовательно друг за другом. Перед запуском очереди заданий клиентов Диска Яндекс проверяется наличие уже запущенного экземпляра Диска Яндекс. Если такой экземпляр будет найден, то выдаётся команда на его остановку.

При включении мной такого задания по расписанию имелось в виду, что каждое задание выполняется не менее 5-ти минут. Следовательно, общее время выполнения указанных заданий составит не менее 25-ти минут. В реальности оно больше за счёт различного рода пауз между отдельными операциями, поэтому его продолжительность была оценена в 30 минут.


Как найти и удалить файлы старше конкретной даты в Linux

1. Посмотрим список всех файлов в папке с датой изменения, для этого стоит выполнить команду:

пример использование команды ls -lah для вывода подробной информации о файлах

пример использование команды 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 — количество дней.


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

Вот быстрый способ сделать это.

В этом кратком руководстве вы узнаете, как находить и удалять файлы старше X дней в Linux и Unix-подобных операционных системах.

Найти и удалить файлы старше X дней в Linux

Отказ от ответственности: вы должны быть очень осторожны при выполнении этих команд.

Эти команды не запрашивают подтверждения перед удалением файлов.

Он просто удалит файлы после нажатия клавиши ENTER. Так что будьте очень осторожны!

Сначала давайте узнаем файлы старше X дней, например 30 дней.

Чтобы сделать так, просто:

Вышеупомянутая команда найдет и отобразит старые файлы старше 30 дней. Вот,

dot (.) — Представляет текущий каталог.
-mtime — представляет время изменения файла и используется для поиска файлов старше 30 дней.
-print — отображает старые файлы


Если вы хотите искать файлы в определенном каталоге, просто замените точку на путь папки.

Например, чтобы узнать файлы, которые старше 30 дней в каталоге / home / sk / Downloads, просто запустите:

Теперь, чтобы удалить файлы, запустите любую из следующих команд.

Снова предупреждаю вас, что эти команды будут удалять файлы сразу после нажатия кнопки ENTER.

Перед выполнением этих команд будьте осторожны и дважды проверьте их.

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

Вы можете использовать свободное пространство для любых других полезных целей.

find /path/to/files/* -mtime +1 -delete

При этом нюанс
-mtime +1
модифицированные больше 1 дня назад

-mtime 1
модифицированные один день назад (сегодня и позавчера уже не затронет)

вместо -delete можете для начала ничего не писать, он выдаст на экран что найдет, чтобы убедиться что все ок.

Нужна команда для удаления файлов старше, определенного времени?

Нет ничего проще. Про команду find и её опции я писал тут. Для реализации данного решения мы опять будем использовать нашу команду.

Например мы хотим удалить файлы в определенной директории старше скажем двух дней:

или с ключом -delete :

Добавляем задачу в cron

Автоматизируем процесс добавив задачу в cron

и в конце внесем запись:

Теперь задача будет отрабатываться каждые два дня в 05:00

Если есть вопросы, то пишем в комментариях и не забываем проголосовать за статью.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.


Мануал

Мы уже рассмотрели, как вручную находить и удалять файлы старше X дней с помощью команды find в Linux.

Сегодня мы сделаем то же самое, но только если файлы не были доступны в течение определенного периода времени.

Передайте «Tmpwatch», утилите командной строки для рекурсивного удаления файлов, к которым не было доступа в течение определенного времени.

Не только файлы, tmpwatch также удалит пустые каталоги.

По умолчанию Tmpwatch решает, какие файлы / каталоги следует удалить, основываясь на их времени (времени доступа).

Конечно, вы можете изменить это поведение, используя также значения ctime (время изменения inode), mtime (время изменения).

Обычно Tmpwatch можно использовать для удаления содержимого каталога /tmp и других неиспользуемых материалов, таких как старые файлы журнала.

Важное предупреждение !!

Перед началом использования этого инструмента вы должны знать, что Tmpwatch рекурсивно удаляет файлы и каталоги на основе заданных критериев. Не запускайте tmpwatch в / (root каталоге). Этот каталог содержит важные файлы, которые необходимы для работы системы Linux. Если вы не будете осторожны, tmpwatch удалит важные системные файлы и каталоги, которые соответствуют заданным критериям, во всем корневом каталоге. В инструмент Tmpwatch не встроен защитный механизм, который бы препятствовал запуску его в корневом каталоге. Таким образом, нет способа отменить операцию. Вы были предупреждены!

Установка Tmpwatch

Tmpwatch доступен в репозиториях по умолчанию большинства дистрибутивов Linux.

На Fedora вы можете установить его с помощью команды:

В Debian и его производных, таких как Ubuntu, Tmpwatch доступен под другим именем, т.е. Tmpreaper.

Удалите файлы, которые не были доступны в течение определенного времени, используя Tmpwatch / Tmpreaper

Использование Tmpwatch и Tmpreaper практически одинаково.

Если вы работаете в системах на основе Debian, замените «Tmpwatch» на «Tmpreaper» в следующих примерах.

Удалить файлы, к которым нет доступа более X дней

Чтобы удалить файлы старше 10 дней, запустите:

Приведенная выше команда удалит все файлы и пустые каталоги, к которым не было доступа более 10 дней, из /var/log/.

Удалить файлы, которые не были изменены более X дней

Как я уже сказал, Tmpwatch будет удалять файлы в зависимости от времени доступа к ним.

Вы также можете удалять файлы в зависимости от времени их изменения (mtime).

Например, следующая команда удалит файлы, которые не были изменены в течение 10 дней по указанному пути.

Параметр <time_spec> определяет возрастной порог для удаления файлов. Вы можете использовать следующие параметры time_spec для удаления файлов.

Например, чтобы удалить файлы, которые не были изменены в течение последних 10 часов, просто запустите:

Удалить символические ссылки

Если вы хотите удалить символические ссылки, а не только обычные файлы и каталоги, используйте опцию -s.

Удалить все файлы

Приведенная выше команда удалит все типы файлов, включая обычные файлы, символические ссылки и каталоги в папке /var/log/.

Исключить каталоги из удаления

Иногда вы можете захотеть удалить файлы, но не каталоги. если это так, команда будет:

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

Выполните тестовый прогон, фактически не удаляя ничего

Иногда вы можете захотеть посмотреть, какие файлы на самом деле будут удалены.

Это будет полезно при запуске Tmpwatch в важном каталоге.

Если это так, запустите Tmpwatch в тестовом режиме с параметром -t.

Пример вывода с сервера CentOS 7:

В системах на основе Debian вы увидите вывод, подобный приведенному ниже.

Это только симулирует операцию, но фактически ничего не удаляет. Tmpwatch просто выполнит пробный прогон и покажет вам, какие файлы будут удалены в выводе.

Принудительное удаление файла

Если вы хотите принудительно удалить файлы, используйте опцию -f и покажите, какие файлы будут удалены в выводе.

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

Опция -f также удалит их.

Опять же, пожалуйста, будьте осторожны при использовании команд Tmpwatch / Tmpreaper.

Читайте также: