17

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

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

7 ответов7

15

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

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

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

8

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

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

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

8

Решение с указанием секунд 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
6

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

touch -d '-60 seconds' /tmp/newerthan
find . -name "*.txt" -newer /tmp/newerthan
5

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

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 .

1

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

$ touch test; find . -type f -mmin 0
./test
1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .