Чому знаходить -mtime +1 лише повернення файлів, старших 2 днів?


116

Я з усіх сил , щоб обернути свій розум навколо чому в findінтерпретують файл час модифікації так , як це робить. Зокрема, я не розумію, чому -mtime +1не відображаються файли віком до 48 годин.

Як приклад тесту, я створив три тестові файли з різними зміненими датами:

[root@foobox findtest]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 25 08:44 foo1
-rw-r--r-- 1 root root 0 Sep 24 08:14 foo2
-rw-r--r-- 1 root root 0 Sep 23 08:14 foo3

Потім я побіг знайти за допомогою -mtime +1перемикача і отримав такий вихід:

[root@foobox findtest]# find -mtime +1
./foo3

Потім я побіг знайти з -mmin +1440і отримав наступний вихід:

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2

Згідно з довідковою сторінкою для пошуку, я розумію, що така поведінка очікується:

 -mtime n
        File’s  data was last modified n*24 hours ago.  See the comments
        for -atime to understand how rounding affects the interpretation
        of file modification times.


-atime n
       File  was  last  accessed n*24 hours ago.  When find figures out
       how many 24-hour periods ago the file  was  last  accessed,  any
       fractional part is ignored, so to match -atime +1, a file has to
       have been accessed at least two days ago.

Це все ще для мене не має сенсу. Отже, якщо файл - 1 день, 23 години, 59 хвилин і 59 секунд, find -mtime +1ігнорує все це і просто трактує його так, як це 1 день, 0 годин, 0 хвилин і 0 секунд? У такому випадку це технічно не старше 1 дня і проігноровано?

Чи ... не ... обчислює.


7
Спочатку мені це теж здалося смішним, але якщо ви вважаєте, що він вимірює вік файлів у цілих днях, то він робить саме те, що ви очікували. Він не дасть файлів, рівних 1 дня. Файл, якому не доводиться int (1,99) днів, немає> 1.
Восьминіг

Відповіді:


86

Ну, проста відповідь, я думаю, що ваша реалізація пошуку відповідає стандарту POSIX / SuS, який говорить, що він повинен вести себе таким чином. Цитуючи SUSv4 / IEEE Std 1003.1, 2013 року видання, "знайти" :

-mtime n
     Первинний повинен оцінити як істинне, якщо час модифікації файлу, відняте
     від часу ініціалізації, розділене на 86400 (з залишком залишеного), є n.

(В іншому випадку в цьому документі пояснюється, що nнасправді може бути +n, і значення цього поняття "більше, ніж").

Щодо того , чому стандарт говорить , що повинен вести себе таким чином, ну, я думаю , давно в минулому програміст полінувався або не думати про це, а просто написав код C (current_time - file_time) / 86400. C ціла арифметика відкидає решту. Сценарії починалися залежно від такої поведінки, і таким чином вона була стандартизована.

Поведінка spec'd також переноситься на гіпотетичну систему, яка зберігає лише дату зміни (не час). Я не знаю, чи існувала така система.


2
Знахідка була чітко розроблена, щоб робити лише роботи з прибирання.
К'єльд Фларуп

83

Аргумент to -mtimeінтерпретується як кількість цілих днів у віці файлу. -mtime +nозначає суворо більше , -mtime -nозначає строго менше.

Зауважте, що з Bash ви можете зробити інтуїтивніше:

$ find . -mmin +$((60*24))
$ find . -mmin -$((60*24))

щоб знайти файли старші та новіші, ніж на 24 години відповідно.

(Це також простіше, ніж вводити дробовий аргумент -mtimeдля того, коли ви хочете дозволити через години або хвилини.)


2
Щоб перелічити ці файли (лише звичайні) з читаними для людини розмірами та в хронологічному порядку, зробіть$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
Євгеній Сергєєв,

1
Це також матиме той самий ефект, що обидві ці команди разом все одно пропустять файли всередині цього хвилинного вікна 24 години тому.
Восьминіг

1
$(())синтаксис арифметичного простого оболонки, не характерний для Баша, пор. pubs.opengroup.org/onlinepubs/009695399/utilities/…
Йосип Родін

@JosipRodin Ні, не обов’язково правда! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Оскільки Bash є "розширеним" SH, він підтримує цей синтаксис, але деякі інші оболонки не роблять, наприклад, csh / tcsh.
t0r0X

@ t0r0X мій погляд був у тому, що це не башизм, скоріше він працює в тирі і zsh і все, що ще служить звичайним /bin/sh.
Йосип Родін

44

Дробові 24-годинні періоди усічені! Це означає, що "find -mtime +1" говорить про відповідність файлам, модифікованим два або більше днів тому.

find . -mtime +0 # find files modified greater than 24 hours ago
find . -mtime 0 # find files modified between now and 1 day ago
# (i.e., in the past 24 hours only)
find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0)
find . -mtime 1 # find files modified between 24 and 48 hours ago
find . -mtime +1 # find files modified more than 48 hours ago

Наступне може працювати лише в GNU?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago

Дякую, я намагався з’ясувати, чому -mtime X відрізнявся від -mtime + X
Vnge

Я вважаю, що + X означає шорти для (X + 1, X + 2, X + 3, ...). :)
Ерік Чжен

18

Отже, якщо файлу 1 день, 23 години, 59 хвилин і 59 секунд, знайдіть -mtime +1 проігнорує все це і просто обробляє його так, як це 1 день, 0 годин, 0 хвилин і 0 секунд?

Так. Як man findкаже, "будь-яка дробова частина ігнорується". Якщо розділити "1 день, 23 години, 59 хвилин і 59 секунд" на "24 години", ви можете отримати 1.9999, але частина .9999 потім знімається, і файл раптом становить лише 1 день.


18

-mtime Nозначає файли, вік яких A в днях задовольняє NA < N +1. Іншими словами, вибирає файли, які востаннє змінені між N та N +1 днями тому.-mtime N

-mtime -Nозначає файли, вік задовольняє A < N , тобто файли , змінені менш ніж N днів тому. Менш інтуїтивно - файли, вік яких A відповідає N +1 ≤ A , тобто файли, змінені щонайменше N +1 днів тому.-mtime +N

Наприклад, -mtime 1вибирає файли, які були змінені від 1 до 2 днів тому. -mtime +1вибирає файли, які були змінені щонайменше 2 дні тому. Щоб змінити файли принаймні 1 день тому, використовуйте -mtime +0.

Опис "востаннє змінено n * 24 години тому" є лише наближенням і не дуже зрозумілим.

Якщо вам важко запам'ятати ці правила, замість цього скористайтеся довідковим файлом.

touch -d '1 day ago' cutoff
find . -newer cutoff

(Синтаксис "1 день тому" вимагає GNU touch.)


3
Приємне пояснення, перші 3 абзаци слід додати до документації find!
Melebius

4

Використовуйте -mmin, -amin тощо для отримання точних результатів


6
Ці -?minаргументи працюють точно так же , як і -?timeаргументи , за винятком з хвилини замість днів. Вони також не "точні".
Жиль

-2

Якщо ви хочете рівно 48-годинних файлів, а не 2 дні, тоді вам слід додати --daystartсвою findкоманду. Це вам допоможе.

find . type -f -daystart -mtime +1

5
Ні, спочатку це -daystart(розширення GNU), ні --daystart. Тоді -daystartпросто означає порівняти часи з початком сьогодні замість поточного часу, тому --daystart -mtime +1повідомлять про файли, які були змінені за 48 годин / 2 години до початку сьогоднішнього дня, тому зазвичай файли, які були модифіковані суворо раніше, ніж позавчора .
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.