varios script por para mayores ficheros fecha eliminar dias con carpetas carpeta buscar borrar archivos archivo bash shell

bash - por - Script de shell para eliminar directorios anteriores a n días



eliminar archivos por fecha centos (5)

Estaba luchando para hacer esto bien utilizando los scripts que se proporcionan arriba y algunos otros scripts, especialmente cuando los nombres de archivos y carpetas tenían nueva línea o espacios.

Finalmente tropezamos con Tmpreaper y hasta ahora nos ha funcionado bastante bien.

tmpreaper -t 5d ~/Downloads tmpreaper --protect ''*.c'' -t 5h ~/my_prg

link fuente original

Tiene características como prueba, que verifica los directorios recursivamente y los enumera. Posibilidad de eliminar enlaces simbólicos, archivos o directorios y también el modo de protección para un determinado patrón al eliminar

Tengo directorios nombrados como:

2012-12-12 2012-10-12 2012-08-08

¿Cómo eliminaría los directorios que tienen más de 10 días con un script de shell bash?


Esto lo hará de manera recursiva para usted:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} /;

Explicación:

  • find : el comando de unix para encontrar archivos / directorios / enlaces, etc.
  • /path/to/base/dir : el directorio para comenzar su búsqueda
  • -type d : solo encontrar directorios
  • -ctime +10 : solo considera los que tienen un tiempo de modificación mayor a 10 días
  • -exec ... /; : para cada resultado encontrado, haga el siguiente comando en ...
  • rm -rf {} : recursivamente fuerza eliminar el directorio; la {} parte es donde el resultado de búsqueda se sustituye por la parte anterior.

Alternativamente, use:

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf

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

rm -rf dir1 dir2 dir3 ...

Opuesto a:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ...

como en el método -exec .

Nota: También vea el comentario de @ MarkReed a continuación sobre el uso preferido con la versión moderna de find .


O

rm -rf `find /path/to/base/dir/* -type d -mtime +10`

Versión actualizada y más rápida de la misma:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f


Si desea eliminar todos los subdirectorios en /path/to/base , por ejemplo

/path/to/base/dir1 /path/to/base/dir2 /path/to/base/dir3

pero no desea eliminar la raíz /path/to/base , debe agregar las -mindepth 1 y -maxdepth 1 , que accederán solo a los subdirectorios en /path/to/base

-mindepth 1 excluye la raíz /path/to/base de las coincidencias.

-maxdepth 1 SÓLO coincidirá con subdirectorios inmediatamente debajo de /path/to/base como /path/to/base/dir1 , /path/to/base/dir2 y /path/to/base/dir3 pero no mostrará los subdirectorios de estos de manera recursiva Por lo tanto, estos subdirectorios de ejemplo no aparecerán en la lista:

/path/to/base/dir1/dir1 /path/to/base/dir2/dir1 /path/to/base/dir3/dir1

Etcétera.

Por lo tanto, para eliminar todos los subdirectorios en /path/to/base que son anteriores a 10 días;

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf


find supports -delete operation, entonces:

find /base/dir/* -ctime +10 -delete;

Creo que hay una trampa que los archivos deben tener 10+ días más. No lo he intentado, alguien puede confirmar en los comentarios.

La solución más votada aquí falta -maxdepth 0 por lo que llamará a rm -rf para cada subdirectorio, después de eliminarlo. Eso no tiene sentido, entonces sugiero:

find /base/dir/* -maxdepth 0 -type d -ctime +10 -exec rm -rf {} /;

La solución -delete anterior no usa -maxdepth 0 porque find se quejaría de que el directorio no está vacío. En cambio, implica -depth y elimina de abajo hacia arriba.