Я хотел бы, чтобы команда Linux нашла файлы, измененные за последние n
секунд.
Есть ли сценарий оболочки или другой инструмент, который я могу запустить из интерфейса командной строки или графического интерфейса?
Используйте команду find следующим образом:
find . -name "*.txt" -mtime -60s
Чтобы найти все *.txt
файлы, измененные за последние 60 секунд.
Подобно тому, что предложил Гленн, если вы хотите найти все измененное, скажем, во время, в течение которого выполнялся процесс установки, может быть проще сделать что-то вроде:
touch /tmp/checkpoint
<do installer stuff>
find / -newer /tmp/checkpoint
Тогда вам не нужно делать расчет времени; вы просто находите вещи, измененные после файла контрольных точек.
Решение с указанием секунд 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
Если у вас есть версия find, которая не поддерживает -mtime -60s
то лучшим решением будет
touch -d '-60 seconds' /tmp/newerthan
find . -name "*.txt" -newer /tmp/newerthan
Самый простой способ сделать это:
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
.
Если ваша версия find
не принимает секунды или реальные значения, как и моя, используйте -mmin
, но укажите 0, и все файлы будут изменены менее чем за минуту:
$ touch test; find . -type f -mmin 0
./test
Если вы отслеживаете изменения файлов в каталоге, вы, вероятно, захотите использовать inotify-tools вместо бесконечного цикла опроса.