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


19

Я хотів би, щоб команда Linux знаходила файли, змінені за останні nсекунди.

Чи є скрипт оболонки чи інший інструмент, який я можу запустити з інтерфейсу командного рядка або GUI?

Відповіді:


14

Використовуйте команду find так:

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

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


17
У Linux, використовуючи знахідку (від GNU Findutils 4.4.2), я отримую повідомлення про помилку з допомогою наступної команди: find: missing argument to `-mtime'. Однак я можу отримати бажану поведінку, використовуючи -mmin та десятковий аргумент. Я не зміг знайти жодної посилання на сторінці пошуку для використання sв якості аргументу.
dr jimbob

4
-60-ті не є вагомим аргументом -mtime. Також "60-ті" навіть не є дійсним варіантом у пошуку POSIX або GNU. Аргументом до -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(для модифікованих протягом останніх хвилин), і чи можна це взяти в десятковий аргумент; наприклад, наступні знаходження файлів, змінених за останні 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

8

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

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

Тоді вам не доведеться робити розрахунок часу; Ви просто знайдете, що змінилося після файлу контрольної точки.


6

Якщо у вас є версія пошуку, яка не підтримує, -mtime -60sтоді краще рішення

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

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версій.


2
Це, очевидно, найкраще рішення.
безпосередньоah


1

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

$ touch test; find . -type f -mmin 0
./test
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.