find - mtime vs mmin - Странные результаты

Поэтому я работаю над сценарием bash для очистки временных файлов и столкнулся с необъяснимым поведением.

# Find using mmin flag
find /usr/local/store/file/temp/3_day/ -mmin +$((60*24*3)) -type f > /tmp/old_files_by_mmin.txt

# Find using mtime flag
find /usr/local/store/file/temp/3_day/ -mtime +3 -type f > /tmp/old_files_by_mtime.txt

diff -u /tmp/old_files_by_mmin.txt /tmp/old_files_by_mtime.txt

Первые несколько строк:

--- /tmp/old_files_by_mmin.txt  2016-08-03 16:56:42.535458820 +0000
+++ /tmp/old_files_by_mtime.txt 2016-08-03 16:56:58.310681524 +0000
@@ -117,59 +117,6 @@
/usr/local/store/file/temp/3_day/image/resize/2016/07/29/11/15/36/1296924350
/usr/local/store/file/temp/3_day/image/resize/2016/07/29/11/47/52/1950191632
/usr/local/store/file/temp/3_day/image/resize/2016/07/29/11/30/01/711250694
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/10/04/15/44313759
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/10/04/15/1589177813
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/10/04/15/1189074525
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/10/56/44/91382315
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/09/43/45/1622776054
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/01/44/57/1465920226
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/01/23/17/1467026748
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/01/15/58/1990201487
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/01/13/19/1990298215
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/01/35/59/518813467
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/12/10/53/1962045410
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/12/31/27/290517373
-/usr/local/store/file/temp/3_day/image/resize/2016/07/31/12/05/08/547481306

Почему флаг -mmin собирает файлы, а не флаг mtime? Если оба должны найти какие-либо файлы старше, чем сейчас + 3 дня?

1 ответ

Решение

Учитывая различие между реализациями, стоит посмотреть, что стандарт POSIX для find мандаты:

-mtime n

Первичный должен оценивать как истинный, если время модификации файла, вычтенное из времени инициализации, деленное на 86400 (с любым отброшенным остатком), равно n.


Точно так же в соответствии с руководством (для BSD найти):

-mtime n[smhdw]

Если никакие единицы не указаны, это первичное значение оценивается как истинное, если разница между временем последнего изменения файла и временем поиска было начато, округленное до следующего полного 24-часового периода, n 24-часовые периоды.

... таким образом: в BSD find поведение по умолчанию - округление до полных 24-часовых периодов.


Для GNU find есть мера конфигурируемости; увидеть -daystart:

-daystart

Измерьте время (для -amin, -atime, -cmin, -ctime, -mmin и -mtime) с начала сегодняшнего дня, а не с 24 часов назад. Эта опция влияет только на тесты, которые появляются позже в командной строке.

Тем не менее, поведение по умолчанию, как указано в определении для -atime:

-atime n

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

Другие вопросы по тегам