Eliminar archivos de más de 7 días

79

Escribo el siguiente comando para eliminar todos los archivos que tienen más de 7 días, pero no funciona:

find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;

¿Cómo puedo eliminar estos archivos?

Malihe Pakyari
fuente
55
Debe haber un espacio entre namey '*.gz'.
Jos

Respuestas:

136

Como @Jos señaló que te perdiste un espacio entre namey '*.gz'; También para acelerar el uso de comandos -type fopción de ejecutar el comando en f iles solamente.

Entonces el comando fijo sería:

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

Explicación:

  • find: El comando UNIX para encontrar f iles / d irectories / l tintas y etc.
  • /path/to/: el directorio para comenzar su búsqueda.
  • -type f: solo busca archivos.
  • -name '*.gz': enumera los archivos que terminan en .gz.
  • -mtime +7: solo considere los que tienen un tiempo de modificación mayor a 7 días.
  • -execdir ... \;: para cada resultado encontrado, realice el siguiente comando en ....
  • rm -- '{}': eliminar el archivo; la {}parte es donde se sustituye el resultado de la búsqueda de la parte anterior. --significa que los parámetros de fin de comando evitan el error de solicitud para aquellos archivos que comienzan con guión .

Alternativamente, use:

find /path/to/ -type f -mtime +7 -name '*.gz' -print0 | xargs -r0 rm --

Del hombre encuentra :

-print0 
      True; print the full file name on the standard output, followed by a null character 
  (instead of the newline character that -print uses). This allows file names that contain
  newlines or other types of white space to be correctly interpreted by programs that process
  the find output. This option corresponds to the -0 option of xargs.

Lo cual es un poco más eficiente, porque equivale a:

rm file1 file2 file3 ...

Opuesto a:

rm file1; rm file2; rm file3; ...

como en el -execmétodo


Un comando alternativo y también más rápido es usar el +terminador de exec en lugar de\; :

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' +

Este comando se ejecutará rmsolo una vez al final en lugar de cada vez que se encuentre un archivo y este comando es casi tan rápido como usar la -deleteopción que se muestra en moderno find:

find /path/to/ -type f -mtime +7 -name '*.gz' -delete
αғsнιη
fuente
3
¿Por qué no iría directo -deleteal final? ¿Por qué meterse con el +o \;?
rain01
3
@ rain01 por favor lea unix.stackexchange.com/q/167823/72456
αғsнιη
2

Tenga cuidado al eliminar archivos con find. Ejecute el comando con -ls para verificar lo que está eliminando

find /media/bkfolder/ -mtime +7 -name '*.gz' -ls . Luego, abra el comando del historial y agregue-exec rm {} \;

Limite el daño que puede hacer un comando de búsqueda. Si desea eliminar archivos de un solo directorio, -maxdepth 1evita que find recorra los subdirectorios o busque en el sistema completo si escribe /media/bkfolder /.

Otros límites que agrego son argumentos de nombre más específicos -name 'wncw*.gz', como agregar un tiempo más reciente -mtime -31y citar los directorios buscados. Estos son particularmente importantes si está automatizando limpiezas.

find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;

zeke
fuente