Команда Linux для поиска файлов, измененных за последние n секунд

19

Я хотел бы, чтобы команда Linux нашла файлы, измененные за последние nсекунды.

Есть ли сценарий оболочки или другой инструмент, который я могу запустить из интерфейса командной строки или графического интерфейса?

Питер Мортенсен
источник

Ответы:

14

Используйте команду find следующим образом:

find . -name "*.txt" -mtime -60s

Чтобы найти все *.txtфайлы, измененные за последние 60 секунд.

анубхава
источник
17
В Linux, используя находку (от GNU Findutils 4.4.2), я получаю сообщение об ошибке с помощью следующей команды: find: missing argument to `-mtime'. Тем не менее, я могу получить желаемое поведение, используя -mmin и десятичный аргумент. Я не смог найти никакой ссылки в справочной странице для поиска для использования sв качестве аргумента.
Доктор Джимбоб
4
-60s не является допустимым аргументом -mtime. «60-е годы» также не являются допустимой опцией в POSIX или GNU find. Аргументом -mtimeявляется число, которое указывает количество 24-часовых периодов назад, когда файл был изменен.
dannysauer
13

Решение с указанием секунд mtime не работает на моих системах Linux, которые используют find --version== find (GNU findutils) 4.4.2.

Я получаю следующую ошибку:

mycomputer:~/new$ find . -mtime -60s
find: missing argument to `-mtime'
mycomputer:~/new$ find . -mtime -60seconds
find: missing argument to `-mtime'

Тем не менее, я могу использовать -mmin(для изменения за последние m минут) и может принимать десятичный аргумент; Например, следующее находит файлы, измененные за последние 30 секунд.

find . -mmin 0.5

Так, например; создавая файлы, последние измененные 1 с, 6 с, 11 с, ... назад за последние 120 секунд, эта команда находит:

mycomputer:~/new$ for i in $(seq 1 5 120); do touch -d "-$i seconds" last_modified_${i}_seconds_ago ; done
mycomputer:~/new$ find . -mmin 0.5
.
./last_modified_1_seconds_ago
./last_modified_26_seconds_ago
./last_modified_11_seconds_ago
./last_modified_16_seconds_ago
./last_modified_21_seconds_ago
./last_modified_6_seconds_ago

Так что если вам это действительно нужно за считанные секунды, вы можете сделать что-то вроде:

localhost:~/new$ for i in $(seq 1 1 120); do touch -d "-$i seconds" last_modified_${i}_seconds_ago ; done
localhost:~/new$ N=18; find . -mmin $(echo "$N/60"|bc -l)
./last_modified_1_seconds_ago
./last_modified_9_seconds_ago
./last_modified_14_seconds_ago
./last_modified_4_seconds_ago
./last_modified_12_seconds_ago
./last_modified_13_seconds_ago
./last_modified_8_seconds_ago
./last_modified_3_seconds_ago
./last_modified_5_seconds_ago
./last_modified_11_seconds_ago
./last_modified_17_seconds_ago
./last_modified_16_seconds_ago
./last_modified_7_seconds_ago
./last_modified_15_seconds_ago
./last_modified_10_seconds_ago
./last_modified_6_seconds_ago
./last_modified_2_seconds_ago
доктор джимбоб
источник
8

Подобно тому, что предложил Гленн, если вы хотите найти все измененное, скажем, во время, в течение которого выполнялся процесс установки, может быть проще сделать что-то вроде:

touch /tmp/checkpoint
<do installer stuff>
find / -newer /tmp/checkpoint

Тогда вам не нужно делать расчет времени; вы просто находите вещи, измененные после файла контрольных точек.

dannysauer
источник
6

Если у вас есть версия find, которая не поддерживает, -mtime -60sтогда лучшим решением будет

touch -d '-60 seconds' /tmp/newerthan
find . -name "*.txt" -newer /tmp/newerthan
scentos
источник
6

Самый простой способ сделать это:

find . -name "*.txt" -newermt '6 seconds ago'

-mtime -60sВариант, упомянутый в ответе, не работает на многих версиях find, даже в 2016 году -newermtэто гораздо лучший вариант для нас. Он может анализировать много разных форматов даты и времени.

Альтернативный метод, использующий mminэто:

find . -name "*.txt" -mmin -0.5

# Finds files modified within the last 0.5 minute, i.e. last 30 seconds

Эта опция может не работать для всех findверсий.

shivams
источник
2
Это явно лучшее решение.
Rednoah
1

Если вы отслеживаете изменения файлов в каталоге, вы, вероятно, захотите использовать inotify-tools вместо бесконечного цикла опроса.

Гленн Джекман
источник
1

Если ваша версия findне принимает секунды или реальные значения, как у меня, используйте -mmin, но укажите 0, и все файлы будут изменены менее чем за минуту:

$ touch test; find . -type f -mmin 0
./test
soyayix
источник