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?

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.


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

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.


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

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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.