2015-10-29 2 views
17

Я пытаюсь найти файлы, измененные за последние x минут, например, в последний час. Многие форумы и учебники по сети предлагают использовать команду найти с -mmin опции, например:Как найти файлы, измененные за последние 6 минут (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?

ответ

30

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

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

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

Ummm..clever .. + 1 – heemayl

+0

Вы также можете использовать флаг -r для xargs, чтобы предотвратить его запуск, если нет входного сигнала. Конечно, я также настоятельно рекомендую предотвратить появление пробелов в имени файла из-за проблем при использовании xargs. Пример: 'find. -mmin 60 -print0 | xargs -0r ls -l'. Новая строка обычно довольно безопасна, за исключением активных нападающих 'find. -mmin 60 | xargs '-rd \ n' ls -l' Альтернатива -exec в ответе выше, конечно, также решает обе проблемы. –

-1

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

find -type f -mtime -60 
+0

find -type f -mtime -90 –

+0

это находит файлы старше 60 ** дней **, а не минуты. – MSalters

2

Руководство по находке:

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's status was last changed n minutes ago. 

    -cnewer file 
      File's 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's 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 
0

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

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 
} 
8

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

find . -mmin -60 

выходы:

. 
./file1 
./file2 

Примечание линия с одной точкой?
То, что делает ls, перечислит всю директорию точно так же, как и при выполнении ls -l ..

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

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

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

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

Или просто:

find . -mmin -60 -type f -ls 

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

find . -mmin -60 -ls 
+0

Спасибо! Эта точка была именно корнем проблемы! – hashbang

+0

@hashbang Обычный способ поблагодарить - это проголосовать за ответ. Если хотите, нажмите на стрелку вверх над количеством голосов слева от ответа. –

0

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

--no-вводного, если пусто
-r
Если стандартный ввод не содержит никаких nonblanks, не выполнить команду. Обычно команда запускается один раз, даже если вход отсутствует. Этот параметр является расширением 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 

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

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

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

Попробуйте эти: изменения

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

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

0

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

$ find /target_directory -type f -mmin -60 

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

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