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.