Я хочу создать каталог с максимальным размером, скажем, 500 МБ. Каталог может содержать любое количество и глубину подкаталогов.
Когда предел максимального размера каталога превышен, я хотел бы очистить каталог последнего доступного файла (ов), пока он не вернется ниже ограничения размера. В идеале пустые каталоги должны быть очищены во время этой операции очистки.
Это не обязательно должно происходить в реальном времени - то есть нормально, если каталог превышает максимум, если только он регулярно очищается.
Я изучил несколько вариантов. Я мог бы смонтировать папку как отдельную файловую систему и запустить quota
на этом, но это не помогает с разумной очисткой старых файлов. Я смотрел (неправильно), используя logrotate
для этой цели, но он не очень хорошо обрабатывает безграничную рекурсию и не имеет возможности для очистки, начиная с самого старого файла.
Без лучшего предложения я планирую освежить свои навыки работы с bash и написать сценарий, который проверяет размер каталога через du -s
, и если он обнаруживает, что каталог больше максимального, то он рекурсивно находит все файлы в каталоге, сначала сортирует их по дате доступа, а затем удаляет их один за другим, проверяя размер каталога и закрывая его, когда каталог обратно под мишень. Этот скрипт можно запустить как задание cron.
Мне просто интересно, не упускаю ли я из виду существующий инструмент или стратегию, которые с этим справляются легче.
(Если вам интересно, почему я спрашиваю, я использую s3fs для монтирования корзин Amazon S3 в локальной файловой системе, и я исследую возможность использования опции use_cache для поддержки локального кеша. Поскольку сегменты S3 могут стать довольно большими, мне нужен способ разумного управления этим кешем.)
Редактировать: tmpreaper
- еще один инструмент, о котором я только что узнал, и он довольно близок к выполнению своей работы. Кажется, что он может очищать папки только в зависимости от времени доступа (а не ограничения размера), но во всех остальных отношениях это хороший выбор.
Все, что вам нужно, это использовать скрипт, размещенный здесь (http://ubuntuforums.org/showthread.php?t=698649). Вам нужно только определить $ TrashPath.