Comando Linux para buscar archivos cambiados en los últimos n segundos

19

Me gustaría que un comando de Linux encuentre archivos modificados en los últimos nsegundos.

¿Hay un script de shell u otra herramienta que pueda ejecutar desde la interfaz de línea de comandos o GUI?

Peter Mortensen
fuente

Respuestas:

14

Use el comando de búsqueda de esta manera:

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

Para encontrar todos los *.txtarchivos modificados en los últimos 60 segundos.

anubhava
fuente
17
En Linux, usando hallazgo (de GNU Findutils 4.4.2), me sale un error con este comando: find: missing argument to `-mtime'. Sin embargo, puedo obtener el comportamiento deseado usando -mmin y un argumento decimal. No pude encontrar ninguna referencia en la página de manual para encontrar para usar scomo argumento.
dr jimbob
44
-60s no es un argumento válido para -mtime. Tampoco es "60" incluso una opción válida en POSIX o GNU find. El argumento para -mtimees un número que especifica la cantidad de períodos de 24 horas cuando se modificó un archivo.
dannysauer
13

La solución con mtime especificando segundos no funciona en mis sistemas Linux que usan find --version== find (GNU findutils) 4.4.2.

Obtuve el siguiente error:

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

Sin embargo, puedo usar -mmin(para modificar en los últimos m minutos), y puede tomar un argumento decimal; por ejemplo, lo siguiente busca archivos modificados en los últimos 30 segundos.

find . -mmin 0.5

Así por ejemplo; creando archivos modificados por última vez 1s, 6s, 11s, ... durante los últimos 120 segundos, este comando encuentra:

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

Entonces, si realmente lo necesita en segundos, puede hacer algo como:

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
fuente
8

Similar a lo que sugirió Glenn, si desea encontrar todo modificado, digamos, en el tiempo durante el cual se ejecutó un proceso de instalación, podría ser más fácil hacer algo como:

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

Entonces no tienes que hacer el cálculo del tiempo; solo encuentras que las cosas cambiaron después del archivo de punto de control.

dannysauer
fuente
6

Si tiene una versión de find que no es compatible, -mtime -60sentonces una mejor solución es

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

La forma más sencilla de hacer esto es:

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

La -mtime -60sopción, mencionada en una respuesta, no funciona en muchas versiones find, incluso en 2016. -newermtEs una opción mucho mejor para nosotros. Puede analizar muchos formatos de fecha y hora diferentes.

Un método alternativo que utiliza mmines este:

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

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

Es posible que esta opción no funcione para todas las findversiones.

shivams
fuente
2
Esta es claramente la mejor solución.
rednoah
1

Si está monitoreando un directorio en busca de cambios en los archivos, probablemente desee usar inotify-tools en lugar de algún bucle de sondeo infinito.

Glenn Jackman
fuente
1

Si su versión de findno acepta segundos o valores reales, como el mío, use -mmin, pero especifique 0, y obtendrá todos los archivos modificados en menos de un minuto:

$ touch test; find . -type f -mmin 0
./test
soyayix
fuente