2016-08-03 4 views
2

Итак, я работаю над скриптом bash, чтобы очистить временные файлы и столкнуться с необъяснимым поведением.find - mtime vs mmin - Weird results

# 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 подбирая файлы, флаг время изменения не является? Если оба должны найти файлы старше, чем сейчас + 3 дня?

+1

Это может иметь какое-то отношение к округлению дней. Почему «баш», между прочим? Насколько я знаю, 'find' не является встроенным. – mustaccio

+0

@ mustaccio: Я подозреваю, что вы правы. Не уверен, что вы имеете в виду, что не являетесь «встроенным».Это Linux-система, поэтому bash/find всегда доступны. –

+1

@MikePurcell, «встроенный» означает «часть оболочки», а также внешний инструмент. Если это не часть оболочки, вам нужно указать вашу точную ОС и какую версию инструмента (ов) предоставляет ваша ОС. –

ответ

1

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

-mtime n

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


Аналогично, в ручной (для BSD находке):

-mtime n[smhdw]

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

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


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

-daystart

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

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

-atime n

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