Я изо всех сил , чтобы обернуть свой ум вокруг почему в 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
Затем я запустил find с -mtime +1
переключателем и получил следующий вывод:
[root@foobox findtest]# find -mtime +1
./foo3
Затем я запустил find с -mmin +1440
и получил следующий вывод:
[root@foobox findtest]# find -mmin +1440
./foo3
./foo2
Согласно man-странице для find, я понимаю, что это ожидаемое поведение:
-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 дня и игнорируется?
Не считается.
источник
Ответы:
Ну, простой ответ, я полагаю, заключается в том, что ваша реализация find соответствует стандарту POSIX / SuS, который говорит, что должен вести себя так. Цитирование из SUSv4 / IEEE Std 1003.1, издание 2013 г., «найти» :
(В другом месте этого документа объясняется, что на
n
самом деле может быть+n
, и значение этого слова «больше чем»).Относительно того, почему стандарт говорит, что он должен вести себя таким образом - ну, я думаю, давно в прошлом программист ленился или не думал об этом и просто писал код на Си
(current_time - file_time) / 86400
. Целочисленная арифметика C отбрасывает остаток. Сценарии начинались в зависимости от этого поведения, и поэтому оно было стандартизировано.Поведение спецификации также переносимо на гипотетическую систему, в которой хранится только дата модификации (но не время). Я не знаю, существовала ли такая система.
источник
Аргумент к
-mtime
интерпретируется как количество целых дней в возрасте файла.-mtime +n
означает строго больше ,-mtime -n
значит строго меньше.Обратите внимание, что с Bash вы можете сделать более интуитивно понятным:
найти файлы старше и новее 24 часов соответственно.
(Это также проще, чем вводить дробный аргумент
-mtime
для, когда вы хотите разрешение в часах или минутах.)источник
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
$(())
это простой арифметический синтаксис оболочки, это не относится к Bash, ср. pubs.opengroup.org/onlinepubs/009695399/utilities/…This chapter describes the syntax of that command language as it is used by the sh utility and [...]
, Поскольку Bash является «расширенным» SH, он поддерживает этот синтаксис, но некоторые другие оболочки этого не делают, например, csh / tcsh./bin/sh
.Дробные 24-часовые периоды усекаются! Это означает, что «find -mtime +1» говорит о совпадении файлов, измененных два или более дней назад.
Следующее может работать только на GNU?
источник
Да. Как
man find
говорит «любая дробная часть игнорируется». Если вы разделите «1 день, 23 часа, 59 минут и 59 секунд» на «24 часа», вы можете получить 1,9999, но затем часть .9999 будет удалена, и внезапно файлу будет только 1 день.источник
-mtime N
означает файлы, чей возраст A в днях соответствует N ≤ A < N +1. Другими словами, выбираются файлы, которые были в последний раз изменены от N до N +1 день назад.-mtime N
-mtime -N
означает файлы, возраст которых A соответствует A < N , т.е. файлы, измененные менее N дней назад. Менее интуитивно, означает файлы, чей возраст A удовлетворяет N +1 ≤ A , то есть файлы, измененные по крайней мере N +1 дней назад.-mtime +N
Например,
-mtime 1
выбирает файлы, которые были изменены от 1 до 2 дней назад.-mtime +1
выбирает файлы, которые были изменены не менее 2 дней назад. Чтобы получить файлы, измененные как минимум 1 день назад, используйте-mtime +0
.Описание «последний раз модифицировалось n * 24 часа назад» является лишь приблизительным и не очень понятным.
Если вам трудно запомнить эти правила, используйте вместо этого справочный файл.
(Синтаксис «1 день назад» требует GNU
touch
.)источник
find
!Используйте -mmin, -amin и т. Д., Чтобы получить точные результаты
источник
-?min
аргументы работают точно так же , как и-?time
аргументы , за исключением с минуты вместо дней. Они тоже не «точные».Если вы хотите файлы размером 48 часов, а не 2 дня, добавьте их
--daystart
в своюfind
команду. Это поможет вам.источник
-daystart
(расширение GNU), нет--daystart
. Затем-daystart
просто означает сравнение времени с началом сегодняшнего дня, а не с текущим, поэтому--daystart -mtime +1
будет сообщать о файлах, которые были изменены более чем за 48 ч / 2 часа до начала сегодняшнего дня, поэтому обычно файлы, которые были изменены строго до позавчерашнего дня ,