Polecenie Linux, aby znaleźć pliki zmienione w ciągu ostatnich n sekund

19

Chciałbym, aby polecenie Linuksa znalazło pliki zmienione w ostatnich nsekundach.

Czy istnieje skrypt powłoki lub inne narzędzie, które mogę uruchomić z interfejsu wiersza poleceń lub GUI?

Peter Mortensen
źródło

Odpowiedzi:

14

Użyj polecenia find w następujący sposób:

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

Aby znaleźć wszystkie *.txtpliki zmodyfikowane w ciągu ostatnich 60 sekund.

anubhava
źródło
17
W Linuksie, przy użyciu find (od GNU Findutils 4.4.2), pojawia się błąd z tym poleceniem: find: missing argument to `-mtime'. Jednak mogę uzyskać pożądane zachowanie, używając -mmin i argumentu dziesiętnego. Nie mogłem znaleźć żadnego odnośnika na stronie podręcznika dla find do użycia sjako argumentu.
dr jimbob
4
-60s nie jest poprawnym argumentem -mtime. „60s” nie jest nawet prawidłową opcją w POSIX i GNU find. Argumentem -mtimejest liczba określająca liczbę 24-godzinnych okresów temu, kiedy plik został zmodyfikowany.
dannysauer
13

Rozwiązanie z sekundami określającymi mtime nie działa na moich systemach Linux, które używają find --version== find (GNU findutils) 4.4.2.

Otrzymuję następujący błąd:

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

Mogę jednak użyć -mmin(do modyfikacji w ostatnich m minutach) i mogę przyjąć argument dziesiętny; np. następujące wyszukuje pliki zmodyfikowane w ciągu ostatnich 30 sekund.

find . -mmin 0.5

Na przykład; tworzenie plików ostatnio modyfikowanych 1s, 6s, 11s, ... temu przez ostatnie 120 sekund, to polecenie znajduje:

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

Jeśli naprawdę potrzebujesz tego w kilka sekund, możesz zrobić coś takiego:

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
dr jimbob
źródło
8

Podobnie jak sugeruje glenn, jeśli chcesz znaleźć wszystko zmodyfikowane, powiedzmy, w czasie, gdy działał proces instalatora, może być łatwiej zrobić coś takiego:

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

Nie musisz wtedy obliczać czasu; po prostu zauważysz, że rzeczy zmieniły się po pliku punktu kontrolnego.

dannysauer
źródło
6

Jeśli masz wersję Find, która nie obsługuje, -mtime -60slepszym rozwiązaniem jest

touch -d '-60 seconds' /tmp/newerthan
find . -name "*.txt" -newer /tmp/newerthan
perfumy
źródło
6

Najprostszym sposobem na to jest:

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

-mtime -60sOpcja, o których mowa w odpowiedzi, nie działa w wielu wersjach find, nawet w 2016 roku -newermtjest o wiele lepszym rozwiązaniem dla nas. Może analizować wiele różnych formatów daty i godziny.

Alternatywna metoda mminto:

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

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

Ta opcja może nie działać we wszystkich findwersjach.

Shivams
źródło
2
To jest zdecydowanie najlepsze rozwiązanie.
rednoah
1

Jeśli monitorujesz katalog pod kątem zmian w plikach, prawdopodobnie chcesz użyć narzędzi inotify zamiast nieskończonej pętli odpytywania.

Glenn Jackman
źródło
1

Jeśli twoja wersja findnie akceptuje sekund lub rzeczywistych wartości, podobnie jak moja, użyj -mmin, ale określ 0, a wszystkie pliki zostaną zmodyfikowane w mniej niż minutę:

$ touch test; find . -type f -mmin 0
./test
soyayix
źródło