Script de Bash para eliminar archivos anteriores a x días con subdirectorios

37

Estoy tratando de eliminar una tonelada de archivos anteriores a x días.

Ahora tengo un script para hacer eso

find /path/to/files* -mtime +10 -exec rm {} \; 

Pero esto también eliminará los subdirectorios. Hay un montón de carpetas, pero me gustaría conservarlas y eliminar los archivos de más de 10 días dentro de dichas carpetas.

¿Hay alguna forma de hacer esto?

JoyIan Yee-Hernandez
fuente

Respuestas:

50

type opción para filtrar resultados

findacepta la typeopción para seleccionar, por ejemplo, solo archivos.

find /path/to/files -type f -mtime +10 -delete

Deje afuera -deletepara mostrar lo que eliminaría, y una vez que haya verificado eso, continúe y ejecute el comando completo.

Eso solo se ejecutaría en archivos, no en directorios. Úselo -type dpara el inverso, solo enumerando directorios que coincidan con sus argumentos.


Opciones adicionales

Es posible que desee leer man find, ya que hay algunas opciones más que podría necesitar en el futuro. Por ejemplo, -maxdepthle permitiría restringir solo los elementos encontrados a una profundidad específica, por ejemplo -maxdepth 0, no volvería a aparecer en subdirectorios.

Algunas observaciones

  • Me pregunto cómo el comando habría eliminado una carpeta, ya que no puede eliminar una carpeta rmsolo. Necesitarías rm -reso.

  • Además, /path/to/files*es confuso. ¿Quiso decir /path/to/files/o espera que el comodín se expanda a varios nombres de archivos y carpetas?

  • Ponga {}comillas simples, es decir, '{}'para evitar que el intérprete sustituya el nombre del archivo / directorio sustituido, al igual que protegemos el punto y coma con una barra diagonal inversa.

slhck
fuente
Bueno, hay muchas carpetas dentro de / path / to / files / en realidad me gustaría ejecutar el mtime +10 -exec rm en cada una de esas carpetas pero mantener las carpetas en sí, básicamente me gustaría lograr que elimine todo archivos de más de 10 días y mantener todas las carpetas. Soy un novato lo siento por esa novedad :)
JoyIan Yee-Hernandez
Bueno, ahí lo tienes :) Solo haz un find /path/to/files* -type f -mtime +10y ve lo que saldría.
slhck
Sí, en caso de duda, no hagas el -exec, solo mira lo que encuentra primero.
Rob
2
@ JoyIanYee-Hernandez También puede usar el -deleteargumento para find, que elimina todos los archivos y carpetas, este último solo si está vacío. Implica -depth, es decir, búsqueda de profundidad primero.
Daniel Beck
1
@Kreker Luego debe agregar -mindepth 1para excluir el directorio principal.
slhck
5

Como en respuestas anteriores (+1 para ambos), el truco es usar -type fpredicado.

Tenga en cuenta que en lugar de -exec rm '{}'usted también puede usar -deletepredicado. Pero no hagas eso. Con -exec rm '{}'usted puede (y debe) primero hacer -exec echo rm '{}'para verificar que esto es realmente lo que quiere. Después de eso, vuelva a ejecutar el comando sin el echo.

El uso -deletees más rápido (no adicional fork()y execve()para cada archivo), pero esto es arriesgado porque -deletetambién funciona como una condición, por lo tanto:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

pero si SOLO intercambias argumentos:

# delete ALL files
find . -type f -name '*.tmp' -delete

Si alguna vez necesita findy rmtrabaja más rápido para toneladas de archivos, consulte el find ... | xargs ... rmidioma UNIX.

Michał Šrajer
fuente
44
Creo que tus dos últimos ejemplos son exactamente iguales, ¡quizás quieras corregir eso!
slhck
1

Puede hacerlo fácilmente con el comando find

$ find -type f

Lo que restringe los resultados para que sean del tipo archivo

Bernhard
fuente
1

Estaba luchando por hacer esto bien usando los scripts proporcionados anteriormente y algunos otros scripts, especialmente cuando los archivos y los nombres de carpetas tenían 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

Enlace fuente original

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

usuario52573
fuente
0

Para acelerar el uso del comando en '+'lugar de\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

Esto se ejecutará rmsolo una vez al final en lugar de cada vez que se encuentre un archivo.
( rmpuede ejecutarse varias veces si realmente tiene toneladas de archivos debido a la limitación de longitud de la línea de comandos, pero esto es casi tan rápido como usarlo -delete)

olibre
fuente
0

rm -f find /path/to/files -type file -mtime -5

Esto eliminará los archivos que se modifican en 5 días.

rm -f find /path/to/files -type file -mtime +5

Esto eliminará los archivos que se modificaron antes de 5 días.

Use `before find y al final después de 5.

Nikhil Shinde
fuente