Как найти файлы, измененные за последние x минут (find -mmin работает не так, как ожидалось)

Я пытаюсь найти файлы, измененные за последние x минут, например, в последний час. Многие форумы и учебные пособия в сети предлагают использовать команду find с параметром -mmin, например:

find . -mmin -60 |xargs ls -l

Однако эта команда не работала для меня, как ожидалось. Как видно из приведенного ниже списка, он также показывает файлы, измененные ранее, чем 1 час назад:

-rw------- 1 user user   9065 Oct 28 23:13 1446070435.V902I67a5567M283852.harvester
-rw------- 1 user user   1331 Oct 29 01:10 1446077402.V902I67a5b34M538793.harvester
-rw------- 1 user user   1615 Oct 29 01:36 1446078983.V902I67a5b35M267251.harvester
-rw------- 1 user user  72365 Oct 29 02:27 1446082022.V902I67a5b36M873811.harvester
-rw------- 1 user user  69102 Oct 29 02:27 1446082024.V902I67a5b37M142247.harvester
-rw------- 1 user user   2611 Oct 29 02:34 1446082482.V902I67a5b38M258101.harvester
-rw------- 1 user user   2612 Oct 29 02:34 1446082485.V902I67a5b39M607107.harvester
-rw------- 1 user user   2600 Oct 29 02:34 1446082488.V902I67a5b3aM465574.harvester
-rw------- 1 user user  10779 Oct 29 03:27 1446085622.V902I67a5b3bM110329.harvester
-rw------- 1 user user   5836 Oct 29 03:27 1446085623.V902I67a5b3cM254104.harvester
-rw------- 1 user user   8970 Oct 29 04:27 1446089232.V902I67a5b3dM936339.harvester
-rw------- 1 user user 165393 Oct 29 06:10 1446095400.V902I67a5b3eM290158.harvester
-rw------- 1 user user 105054 Oct 29 06:10 1446095430.V902I67a5b3fM265065.harvester
-rw------- 1 user user   1615 Oct 29 06:24 1446096244.V902I67a5b40M55701.harvester
-rw------- 1 user user   1620 Oct 29 06:24 1446096292.V902I67a5b41M337769.harvester
-rw------- 1 user user  10436 Oct 29 06:36 1446096973.V902I67a5b42M707215.harvester
-rw------- 1 user user   7150 Oct 29 06:36 1446097019.V902I67a5b43M415731.harvester
-rw------- 1 user user   4357 Oct 29 06:39 1446097194.V902I67a5b56M446687.harvester
-rw------- 1 user user   4283 Oct 29 06:39 1446097195.V902I67a5b57M957052.harvester
-rw------- 1 user user   4393 Oct 29 06:39 1446097197.V902I67a5b58M774506.harvester
-rw------- 1 user user   4264 Oct 29 06:39 1446097198.V902I67a5b59M532213.harvester
-rw------- 1 user user   4272 Oct 29 06:40 1446097201.V902I67a5b5aM534679.harvester
-rw------- 1 user user   4274 Oct 29 06:40 1446097228.V902I67a5b5dM363553.harvester
-rw------- 1 user user  20905 Oct 29 06:44 1446097455.V902I67a5b5eM918314.harvester

Фактически, он просто перечислил все файлы в текущем каталоге. Мы можем взять один из этих файлов в качестве примера и проверить, действительно ли его время модификации отображается командой ls:

stat 1446070435.V902I67a5567M283852.harvester

  File: ‘1446070435.V902I67a5567M283852.harvester’
  Size: 9065        Blocks: 24         IO Block: 4096   regular file
Device: 902h/2306d  Inode: 108680551   Links: 1
Access: (0600/-rw-------)  Uid: ( 1001/   user)   Gid: ( 1027/   user)
Access: 2015-10-28 23:13:55.281515368 +0100
Modify: 2015-10-28 23:13:55.281515368 +0100
Change: 2015-10-28 23:13:55.313515539 +0100

Как мы видим, этот файл определенно был изменен ранее, чем 1 час назад! Я также пробовал find -mmin 60 или find -mmin +60, но он тоже не работал.

Почему это происходит и как правильно использовать команду find?

Ответы

Ответ 1

Я могу воспроизвести вашу проблему, если в каталоге, который был изменен за последний час, есть без файлов. В этом случае find . -mmin -60 ничего не возвращает. Однако команда find . -mmin -60 |xargs ls -l возвращает каждый файл в каталоге, который согласуется с тем, что происходит, когда ls -l запускается без аргумента.

Чтобы убедиться, что ls -l запускается только при обнаружении файла, попробуйте:

find . -mmin -60 -type f -exec ls -l {} +

Ответ 2

Проблема заключается в том, что

find . -mmin -60

выходы:

.
./file1
./file2

Обратите внимание на строку с одной точкой?
Это делает ls список всей директории точно такой же, как при выполнении ls -l ..

Одним из решений является список только файлов (не каталогов):

find . -mmin -60 -type f | xargs ls -l

Но лучше использовать непосредственно опцию -exec find:

find . -mmin -60 -type f -exec ls -l {} \;

Или просто:

find . -mmin -60 -type f -ls

Что, кстати, безопасно, даже включая каталоги:

find . -mmin -60 -ls

Ответ 3

Руководство по поиску:

   Numeric arguments can be specified as

   +n     for greater than n,

   -n     for less than n,

   n      for exactly n.

   -amin n
          File was last accessed n minutes ago.

   -anewer file
          File was last accessed more recently than file was modified.  If file is a symbolic link and the -H option or the -L option is in effect, the access time of the file it points  to  is  always
          used.

   -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.

   -cmin n
          File status was last changed n minutes ago.

   -cnewer file
          File status was last changed more recently than file was modified.  If file is a symbolic link and the -H option or the -L option is in effect, the status-change time of the file it  points
          to is always used.

   -ctime n
          File status was last changed n*24 hours ago.  See the comments for -atime to understand how rounding affects the interpretation of file status change times.

Пример:

find /dir -cmin -60 # creation time
find /dir -mmin -60 # modification time
find /dir -amin -60 # access time

Ответ 4

Я работаю с той же потребностью, и я считаю, что ваш временной интервал неверен.

Попробуйте следующее:

  • 15min change: find. -mtime -.01
  • 1 час изменение: найти. -mtime -.04
  • 12 hr change: find. -mtime -.5

Вы должны использовать 24 часа в качестве базы. Число после -mtime должно быть около 24 часов. Таким образом, -5 эквивалент 12 часов, поскольку 12 часов составляет половину 24 часов.

Ответ 5

Это может сработать для вас. Я использовал его для очистки папок во время развертывания для удаления старых файлов развертывания.

clean_anyfolder() {
    local temp2="$1/**"; //PATH
    temp3=( $(ls -d $temp2 -t | grep "`date | awk '{print $2" "$3}'`") )
    j=0;
    while [ $j -lt ${#temp3[@]} ]
    do
            echo "to be removed ${temp3[$j]}"
            delete_file_or_folder ${temp3[$j]} 0 //DELETE HERE
        fi
        j=`expr $j + 1`
    done
}

Ответ 6

Собственно, здесь более одного вопроса. Главное, что xargs по умолчанию выполняет указанную вами команду, даже если аргументы не переданы. Чтобы изменить это, вы можете использовать расширение GNU для xargs:

- нет-вводного, если пусто
-r
Если стандартный ввод не содержит никаких незадействованных элементов, не запускайте команду. Обычно команда запускается один раз, даже если вход отсутствует. Эта опция является расширением GNU.

Простой пример:

find . -mmin -60 | xargs -r ls -l

Но это может совпадать со всеми подкаталогами, включая . (текущий каталог) и ls будет перечислять каждый из них по отдельности. Таким образом, выход будет беспорядочным. Решение: передайте -d в ls, что запрещает перечисление содержимого каталога:

find . -mmin -60 | xargs -r ls -ld

Теперь вам не нравится . (текущий каталог) в вашем списке? Решение: исключить первый уровень каталогов (0) из вывода вывода:

find . -mindepth 1 -mmin -60 | xargs -r ls -ld

Теперь вам нужны только файлы в вашем списке? Решение: исключить каталоги:

find . -type f -mmin -60 | xargs -r ls -l

Теперь у вас есть файлы с именами, содержащими пробелы, кавычки или обратную косую черту? Решение: используйте вывод с нулевым выводом (find) и input (xargs) (это также расширения GNU, afaik):

find . -type f -mmin -60 -print0 | xargs -r0 ls -l

Ответ 7

Для поиска файлов в каталоге /target _directory и всех его подкаталогов, которые были изменены за последние 60 минут:

$ find /target_directory -type f -mmin -60

Чтобы найти самые последние измененные файлы, отсортированные в порядке, обратном порядку обновления (т.е. самые последние обновленные файлы):

$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

Ответ 8

эта команда может помочь вам сэр

find -type f -mtime -60