Shell script para eliminar directorios con más de n días

Tengo directorios llamados 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 bash shell?

preguntado el 13 de diciembre de 12 a las 21:12

¿Tienen alguna relación con su tiempo real de creación/modificación? Porque find podría hacerlo sin mirar el nombre entonces... -

también deberían tener tiempo de creación/modificación -

¿A qué te refieres con "mayor que"? ¿Se refiere a la hora en que se creó el directorio, la hora en que se cambió su contenido por última vez o algo más? Tenga cuidado con algunas de las respuestas a continuación; ctime es el tiempo de cambio de inodo. Para un directorio, cambia cuando se agregan o eliminan archivos del directorio. -

5 Respuestas

Esto lo hará recursivamente por ti:

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 busca directorios
  • -ctime +10: solo considerar aquellos con tiempo de modificación mayor a 10 días
  • -exec ... \;: para cada resultado encontrado, haga el siguiente comando en ...
  • rm -rf {}: forzar recursivamente a 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 -exec método.


Con versiones modernas de find, puede reemplazar el ; con + y hará el equivalente de la xargs llame por usted, pasando tantos archivos como quepan en cada llamada al sistema exec:

find . -type d -ctime +10 -exec rm -rf {} +

Respondido 18 Jul 18, 20:07

-mtime fue mejor para mí, ya que verifica los cambios de contenido en lugar de los cambios de permisos; de lo contrario, fue perfecto. - cambios rápidos

Creo que esto también eliminará el directorio base en sí mismo. O Gal

@OrGal tienes toda la razón. Para evitar esto, simplemente use: find /path/to/base/dir/*. - zloynemec

puede usar -max depth 1 para ignorar el contenido de los directorios - Diana

El enfoque más eficiente puede resultar contraproducente si tiene demasiadas carpetas para eliminar: stackoverflow.com/questions/11289551/…. Por la misma razón, para evitar la eliminación de la carpeta base, es mejor usar -mindepth 1 (más bien que /path/to/folder/*). - Ohad Schneider

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 quieres eliminar la raíz /path/to/base, tienes que agregar -mindepth 1 y -maxdepth 1 opciones, que accederán sólo a los subdirectorios bajo /path/to/base

-mindepth 1 excluye la raíz /path/to/base de los partidos.

-maxdepth 1LA ÚNICA hacer coincidir los subdirectorios inmediatamente debajo /path/to/base como /path/to/base/dir1, /path/to/base/dir2 y /path/to/base/dir3 pero no listará 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.

Entonces, para eliminar todos los subdirectorios bajo /path/to/base que tienen más de 10 días;

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

Respondido 27 Jul 16, 10:07

find apoya -delete operación, entonces:

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

Creo que hay un inconveniente en que los archivos también deben tener más de 10 días. No lo he probado, alguien puede confirmarlo en los comentarios.

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

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

La -delete la solución 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.

Respondido el 03 de enero de 18 a las 18:01

Puedo confirmar -delete funciona, pero como dijiste, solo puedes usarlo para eliminar directorios vacíos, al igual que rmdir. - CTodea

Estaba luchando para hacerlo bien usando las secuencias de comandos proporcionadas anteriormente y algunas otras secuencias de comandos, especialmente cuando los nombres de los archivos y las carpetas tenían una nueva línea o espacios.

Finalmente tropecé con tmpreaper y hasta ahora nos ha funcionado bastante bien.

tmpreaper -t 5d ~/Downloads


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

Fuente original aquí

Tiene funciones como prueba, que comprueba los directorios de forma recursiva y los enumera. Capacidad para eliminar enlaces simbólicos, archivos o directorios y también el modo de protección para un determinado patrón durante la eliminación

Respondido 20 Feb 14, 11:02

OR

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

Versión actualizada y más rápida:

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

Respondido 14 Oct 15, 10:10

Este podría superar fácilmente la longitud máxima de la línea de comandos. Ver xargs --show-limits. - Michael Krupp

Tampoco funcionará si hay nombres de archivo que contengan espacios u otros caracteres especiales de shell. - Martín Tournoij

@Carpetsmoker ¿No es así? -print0/-0 cuidar los caracteres especiales de shell, o no? - mpen

Tienes razón en que el xargs la versión @mpen, pero la primera línea no. - Martín Tournoij

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.