Chciałbym, aby polecenie Linuksa znalazło pliki zmienione w ostatnich n
sekundach.
Czy istnieje skrypt powłoki lub inne narzędzie, które mogę uruchomić z interfejsu wiersza poleceń lub GUI?
Chciałbym, aby polecenie Linuksa znalazło pliki zmienione w ostatnich n
sekundach.
Czy istnieje skrypt powłoki lub inne narzędzie, które mogę uruchomić z interfejsu wiersza poleceń lub GUI?
Odpowiedzi:
Użyj polecenia find w następujący sposób:
find . -name "*.txt" -mtime -60s
Aby znaleźć wszystkie *.txt
pliki zmodyfikowane w ciągu ostatnich 60 sekund.
-mtime
. „60s” nie jest nawet prawidłową opcją w POSIX i GNU find. Argumentem -mtime
jest liczba określająca liczbę 24-godzinnych okresów temu, kiedy plik został zmodyfikowany.
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
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.
Najprostszym sposobem na to jest:
find . -name "*.txt" -newermt '6 seconds ago'
-mtime -60s
Opcja, o których mowa w odpowiedzi, nie działa w wielu wersjach find
, nawet w 2016 roku -newermt
jest o wiele lepszym rozwiązaniem dla nas. Może analizować wiele różnych formatów daty i godziny.
Alternatywna metoda mmin
to:
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 find
wersjach.
Jeśli monitorujesz katalog pod kątem zmian w plikach, prawdopodobnie chcesz użyć narzędzi inotify zamiast nieskończonej pętli odpytywania.
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życias
jako argumentu.