Я хотів би, щоб команда Linux знаходила файли, змінені за останні n
секунди.
Чи є скрипт оболонки чи інший інструмент, який я можу запустити з інтерфейсу командного рядка або GUI?
Я хотів би, щоб команда Linux знаходила файли, змінені за останні n
секунди.
Чи є скрипт оболонки чи інший інструмент, який я можу запустити з інтерфейсу командного рядка або GUI?
Відповіді:
Використовуйте команду find так:
find . -name "*.txt" -mtime -60s
Щоб знайти всі *.txt
файли, змінені за останні 60 секунд.
-mtime
. Також "60-ті" навіть не є дійсним варіантом у пошуку POSIX або GNU. Аргументом до -mtime
є число, яке вказує кількість періодів 24 годин тому, коли файл був змінений.
Рішення із зазначенням 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
(для модифікованих протягом останніх хвилин), і чи можна це взяти в десятковий аргумент; наприклад, наступні знаходження файлів, змінених за останні 30 секунд.
find . -mmin 0.5
Так, наприклад; створюючи файли останнього змінення 1s, 6s, 11s, ... тому протягом останніх 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
Подібно до того, що запропонував glenn, якщо ви хочете знайти все модифіковане, скажімо, за час, коли запускався процес встановлення, може бути простіше зробити щось на кшталт:
touch /tmp/checkpoint
<do installer stuff>
find / -newer /tmp/checkpoint
Тоді вам не доведеться робити розрахунок часу; Ви просто знайдете, що змінилося після файлу контрольної точки.
Найпростіший спосіб зробити це:
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
версій.
Якщо ви відстежуєте каталог для змін у файлах, ви, ймовірно, хочете використовувати інструменти inotify замість нескінченного циклу опитування.
find: missing argument to `-mtime'
. Однак я можу отримати бажану поведінку, використовуючи -mmin та десятковий аргумент. Я не зміг знайти жодної посилання на сторінці пошуку для використанняs
в якості аргументу.