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.
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.
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:
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.
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
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)
find /path/to/files* -type f -mtime +10
y ve lo que saldría.-exec
, solo mira lo que encuentra primero.-delete
argumento parafind
, que elimina todos los archivos y carpetas, este último solo si está vacío. Implica-depth
, es decir, búsqueda de profundidad primero.-mindepth 1
para excluir el directorio principal.Como en respuestas anteriores (+1 para ambos), el truco es usar
-type f
predicado.Tenga en cuenta que en lugar de
-exec rm '{}'
usted también puede usar-delete
predicado. 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 elecho
.El uso
-delete
es más rápido (no adicionalfork()
yexecve()
para cada archivo), pero esto es arriesgado porque-delete
también funciona como una condición, por lo tanto:pero si SOLO intercambias argumentos:
Si alguna vez necesita
find
yrm
trabaja más rápido para toneladas de archivos, consulte elfind ... | xargs ... rm
idioma UNIX.fuente
Puede hacerlo fácilmente con el comando find
Lo que restringe los resultados para que sean del tipo archivo
fuente
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.
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
fuente
Para acelerar el uso del comando en
'+'
lugar de\;
Esto se ejecutará
rm
solo una vez al final en lugar de cada vez que se encuentre un archivo.(
rm
puede 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
)fuente
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.
fuente