Утилита find и время изменения файлов
Когда пишу скрипты с использованием find, регулярно натыкаюсь на одну и ту же неточность в своём понимании некоторых популярных параметров. Конкретно вот этих:
◽ mtime – время последнего изменения файла
◽ ctime – время создания файла
◽ atime – время последнего доступа к файлу
Когда вводишь команду:
# find /mnt/backup -maxdepth 1 -type d -ctime +1
ожидаешь найти все каталоги, созданные более суток назад, чтобы удалить их и освободить место на диске. Я специально взял именно сутки, так как тут сразу наглядно видно разночтение в ожидании и реальности. Find в таком виде покажет каталоги, созданные более трех суток назад.
Вот наглядный пример:
# date +"%Y-%m-%d %H-%M"2022-06-06 19-45# ls -lhdrwxr-xr-x 3 root root 4.0K Jun 2 17:09 2022-06-02drwxr-xr-x 3 root root 4.0K Jun 3 03:03 2022-06-03drwxr-xr-x 3 root root 4.0K Jun 4 03:03 2022-06-04drwxr-xr-x 3 root root 4.0K Jun 5 03:03 2022-06-05drwxr-xr-x 3 root root 4.0K Jun 6 03:03 2022-06-06# find /mnt/backup -maxdepth 1 -type d -ctime +1/mnt/backup/2022-06-04/mnt/backup/2022-06-03/mnt/backup/2022-06-02
Директория 2022-06-05 старше суток, но в вывод find не попала. По факту параметр +1 означает всё, что старше двух суток. А для поиска старше суток, необходимо использовать +0.
Это связано с тем, что find определяет, как много 24-часовых периодов назад директория была создана. Любая дробная часть игнорируется, поэтому для соответствия -ctime +1 директория должна быть создана по крайней мере два дня назад.
Когда используешь большие интервалы, не обращаешь на такую мелочь внимания. А когда у тебя где-то на промежуточном хранилище не хватает свободного места и тебе надо точно рассчитать время хранения, такие нюансы становятся критичны.
Я с периодичностью раз в год-два разбираюсь с этим нюансом. Встречается редко, но когда наткнёшься, начинаешь вспоминать, как там find интерпретирует эти интервалы. Решил записать, может больше не буду забывать, но это вряд ли 🤷🏻♂️.
#bash #find #terminal