Vorrei che un comando Linux trovasse i file modificati negli ultimi n
secondi.
Esiste uno script della shell o un altro strumento che posso eseguire dall'interfaccia della riga di comando o dalla GUI?
Vorrei che un comando Linux trovasse i file modificati negli ultimi n
secondi.
Esiste uno script della shell o un altro strumento che posso eseguire dall'interfaccia della riga di comando o dalla GUI?
Risposte:
Utilizzare il comando find in questo modo:
find . -name "*.txt" -mtime -60s
Per trovare tutti i *.txt
file modificati negli ultimi 60 secondi.
-mtime
. Né "60s" è nemmeno un'opzione valida in POSIX o GNU find. L'argomento a -mtime
è un numero che specifica il numero di periodi di 24 ore fa quando un file è stato modificato.
La soluzione con mtime che specifica i secondi non funziona sui miei sistemi Linux che usano find --version
== find (GNU findutils) 4.4.2
.
Ottengo il seguente errore:
mycomputer:~/new$ find . -mtime -60s
find: missing argument to `-mtime'
mycomputer:~/new$ find . -mtime -60seconds
find: missing argument to `-mtime'
Tuttavia, posso usare -mmin
(per essere modificato negli ultimi m minuti) e posso accettare un argomento decimale; ad esempio, i seguenti file vengono modificati negli ultimi 30 secondi.
find . -mmin 0.5
Quindi per esempio; la creazione di file 1s, 6s, 11s, ... ultima modifica negli ultimi 120 secondi, questo comando trova:
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
Quindi se ne hai davvero bisogno in pochi secondi puoi fare qualcosa del tipo:
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
Simile a ciò che Glenn ha suggerito, se vuoi trovare tutto modificato, diciamo, nel momento in cui è stato eseguito un processo di installazione, potrebbe essere più facile fare qualcosa del tipo:
touch /tmp/checkpoint
<do installer stuff>
find / -newer /tmp/checkpoint
Quindi non devi fare il calcolo del tempo; trovi solo cose cambiate dopo il file del checkpoint.
Il modo più semplice per farlo è:
find . -name "*.txt" -newermt '6 seconds ago'
L' -mtime -60s
opzione, menzionata in una risposta, non funziona su molte versioni find
, nemmeno nel 2016. -newermt
è un'opzione molto migliore per noi. Può analizzare diversi formati di data e ora.
Un metodo alternativo che utilizza mmin
è questo:
find . -name "*.txt" -mmin -0.5
# Finds files modified within the last 0.5 minute, i.e. last 30 seconds
Questa opzione potrebbe non funzionare per tutte le find
versioni.
Se stai monitorando una directory per le modifiche ai file, probabilmente vorrai usare inotify-tools invece di un ciclo di polling infinito.
find: missing argument to `-mtime'
. Tuttavia, posso ottenere il comportamento desiderato usando -mmin e un argomento decimale. Non sono riuscito a trovare alcun riferimento nella manpage da trovares
come argomento.