linux bash unix gnu-findutils

linux - Cómo encontrar archivos modificados en los últimos x minutos(encontrar-mmin no funciona como se esperaba)



bash unix (8)

El problema es ese

find . -mmin -60

salidas:

. ./file1 ./file2

Tenga en cuenta la línea con un punto?
Eso hace que ls liste todo el directorio exactamente igual que cuando ls -l . es ejecutado.

Una solución es listar solo archivos (no directorios):

find . -mmin -60 -type f | xargs ls -l

Pero es mejor usar directamente la opción -exec de buscar:

find . -mmin -60 -type f -exec ls -l {} /;

O solo:

find . -mmin -60 -type f -ls

Que, por cierto, es seguro incluso incluyendo directorios:

find . -mmin -60 -ls

Estoy tratando de encontrar archivos modificados en los últimos x minutos, por ejemplo, en la última hora. Muchos foros y tutoriales en la red sugieren usar el comando de búsqueda con la opción -mmin, como esto:

find . -mmin -60 |xargs ls -l

Sin embargo, este comando no funcionó para mí como se esperaba. Como puede ver en la siguiente lista, también muestra los archivos modificados hace más de una hora:

-rw------- 1 user user 9065 Oct 28 23:13 1446070435.V902I67a5567M283852.harvester -rw------- 1 user user 1331 Oct 29 01:10 1446077402.V902I67a5b34M538793.harvester -rw------- 1 user user 1615 Oct 29 01:36 1446078983.V902I67a5b35M267251.harvester -rw------- 1 user user 72365 Oct 29 02:27 1446082022.V902I67a5b36M873811.harvester -rw------- 1 user user 69102 Oct 29 02:27 1446082024.V902I67a5b37M142247.harvester -rw------- 1 user user 2611 Oct 29 02:34 1446082482.V902I67a5b38M258101.harvester -rw------- 1 user user 2612 Oct 29 02:34 1446082485.V902I67a5b39M607107.harvester -rw------- 1 user user 2600 Oct 29 02:34 1446082488.V902I67a5b3aM465574.harvester -rw------- 1 user user 10779 Oct 29 03:27 1446085622.V902I67a5b3bM110329.harvester -rw------- 1 user user 5836 Oct 29 03:27 1446085623.V902I67a5b3cM254104.harvester -rw------- 1 user user 8970 Oct 29 04:27 1446089232.V902I67a5b3dM936339.harvester -rw------- 1 user user 165393 Oct 29 06:10 1446095400.V902I67a5b3eM290158.harvester -rw------- 1 user user 105054 Oct 29 06:10 1446095430.V902I67a5b3fM265065.harvester -rw------- 1 user user 1615 Oct 29 06:24 1446096244.V902I67a5b40M55701.harvester -rw------- 1 user user 1620 Oct 29 06:24 1446096292.V902I67a5b41M337769.harvester -rw------- 1 user user 10436 Oct 29 06:36 1446096973.V902I67a5b42M707215.harvester -rw------- 1 user user 7150 Oct 29 06:36 1446097019.V902I67a5b43M415731.harvester -rw------- 1 user user 4357 Oct 29 06:39 1446097194.V902I67a5b56M446687.harvester -rw------- 1 user user 4283 Oct 29 06:39 1446097195.V902I67a5b57M957052.harvester -rw------- 1 user user 4393 Oct 29 06:39 1446097197.V902I67a5b58M774506.harvester -rw------- 1 user user 4264 Oct 29 06:39 1446097198.V902I67a5b59M532213.harvester -rw------- 1 user user 4272 Oct 29 06:40 1446097201.V902I67a5b5aM534679.harvester -rw------- 1 user user 4274 Oct 29 06:40 1446097228.V902I67a5b5dM363553.harvester -rw------- 1 user user 20905 Oct 29 06:44 1446097455.V902I67a5b5eM918314.harvester

En realidad, solo listó todos los archivos en el directorio actual. Podemos tomar uno de estos archivos como ejemplo y verificar si su hora de modificación es realmente la que muestra el comando ls:

stat 1446070435.V902I67a5567M283852.harvester File: ‘1446070435.V902I67a5567M283852.harvester’ Size: 9065 Blocks: 24 IO Block: 4096 regular file Device: 902h/2306d Inode: 108680551 Links: 1 Access: (0600/-rw-------) Uid: ( 1001/ user) Gid: ( 1027/ user) Access: 2015-10-28 23:13:55.281515368 +0100 Modify: 2015-10-28 23:13:55.281515368 +0100 Change: 2015-10-28 23:13:55.313515539 +0100

Como podemos ver, este archivo se modificó definitivamente hace más de una hora. También intenté find -mmin 60 o find -mmin +60 , pero tampoco funcionó.

¿Por qué sucede esto y cómo utilizar correctamente el comando de búsqueda?


En realidad, hay más de un problema aquí. La principal es que xargs ejecuta de forma predeterminada el comando que ha especificado, incluso cuando no se han pasado argumentos. Para cambiar eso puedes usar una extensión de GNU para xargs :

--no-ejecutar-si-vacío
-r
Si la entrada estándar no contiene ningún blanco no, no ejecute el comando. Normalmente, el comando se ejecuta una vez, incluso si no hay entrada. Esta opción es una extensión de GNU.

Ejemplo simple:

find . -mmin -60 | xargs -r ls -l

Pero esto podría coincidir con todos los subdirectorios, incluyendo . (el directorio actual), y ls listará cada uno de ellos individualmente. Así que la salida será un desastre. Solución: pase -d a ls , que prohíbe listar los contenidos del directorio:

find . -mmin -60 | xargs -r ls -ld

Ahora no te gusta (el directorio actual) en tu lista? Solución: excluya el primer nivel de directorio ( 0 ) de la salida de búsqueda:

find . -mindepth 1 -mmin -60 | xargs -r ls -ld

¿Ahora solo necesitarías los archivos en tu lista? Solución: excluir los directorios:

find . -type f -mmin -60 | xargs -r ls -l

¿Ahora tiene algunos archivos con nombres que contienen espacios en blanco, comillas o barras invertidas? Solución: use la salida terminada en nulo (encontrar) y la entrada (xargs) (estas también son extensiones GNU, afaik):

find . -type f -mmin -60 -print0 | xargs -r0 ls -l


Esto puede funcionar para usted. Lo utilicé para limpiar carpetas durante las implementaciones para eliminar archivos de implementación antiguos.

clean_anyfolder() { local temp2="$1/**"; //PATH temp3=( $(ls -d $temp2 -t | grep "`date | awk ''{print $2" "$3}''`") ) j=0; while [ $j -lt ${#temp3[@]} ] do echo "to be removed ${temp3[$j]}" delete_file_or_folder ${temp3[$j]} 0 //DELETE HERE fi j=`expr $j + 1` done }


Estoy trabajando en la misma necesidad y creo que su período de tiempo es incorrecto.

Prueba estos:

  • Cambio de 15min: encontrar. -mtime -.01
  • 1 hora de cambio: encontrar. -mtime -.04
  • 12 horas de cambio: encontrar. -mtime -.5

Deberías usar las 24 horas como base. El número después de -mtime debe ser relativo a 24 horas. Por lo tanto, -.5 es el equivalente a 12 horas, porque 12 horas es la mitad de 24 horas.


Manual de búsqueda:

Numeric arguments can be specified as +n for greater than n, -n for less than n, n for exactly n. -amin n File was last accessed n minutes ago. -anewer file File was last accessed more recently than file was modified. If file is a symbolic link and the -H option or the -L option is in effect, the access time of the file it points to is always used. -atime n File was last accessed n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago. -cmin n File''s status was last changed n minutes ago. -cnewer file File''s status was last changed more recently than file was modified. If file is a symbolic link and the -H option or the -L option is in effect, the status-change time of the file it points to is always used. -ctime n File''s status was last changed n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file status change times.

Ejemplo:

find /dir -cmin -60 # creation time find /dir -mmin -60 # modification time find /dir -amin -60 # access time


Para buscar archivos en / target_directory y todos sus subdirectorios, que se hayan modificado en los últimos 60 minutos:

$ find /target_directory -type f -mmin -60

Para encontrar los archivos modificados más recientemente, ordenados en orden inverso al tiempo de actualización (es decir, los archivos actualizados más recientemente primero):

$ find /etc -type f -printf ''%TY-%Tm-%Td %TT %p/n'' | sort -r


Puedo reproducir su problema si no hay archivos en el directorio que se modificaron en la última hora. En ese caso, find . -mmin -60 find . -mmin -60 no devuelve nada. El comando find . -mmin -60 |xargs ls -l find . -mmin -60 |xargs ls -l , sin embargo, devuelve cada archivo en el directorio que es consistente con lo que sucede cuando ls -l se ejecuta sin un argumento.

Para asegurarse de que ls -l solo se ejecuta cuando se encuentra un archivo, intente:

find . -mmin -60 -type f -exec ls -l {} +


este comando puede ser de ayuda señor

find -type f -mtime -60