it-swarm.com.ru

Как найти файлы, измененные за последние 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?

29
hashbang

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

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

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

Проблема в том, что

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
11
user2350426

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

$ find /target_directory -type f -mmin -60

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

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

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

Попробуйте это:

  • 15 минут смена: найти. -mtime -.01
  • 1 час изменения: найти. -mtime -.04
  • 12 часов смена: найти. -mtime -.5

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

3
whakawaehere

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

   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
2
Noproblem

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

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
}
0
sikar

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

--no-вводного, если пусто

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