miércoles, 19 de junio de 2019

Borrar archivos más antiguos de X días en Linux



Cómo borrar todos los archivos de una carpeta creados hace más de X días en un sistema Linux.



Supongamos que tenemos un script corriendo en un sistema operativo Linux cuya función es conectarse a un dispositivo y exportar un backup de su configuración para guardarlo en local.

Si ejecutamos dicho script a diario, el sistema de archivos donde se guarden dichos backups se llenará de archivos, lo cual provocará que, a la larga, el disco duro llegue al 100% de ocupación y el sistema operativo deje de funcionar. Para evitar este problema, podemos usar un comando que vaya eliminando archivos cuya fecha de creación sea más antigua de X días. Dicho de otra forma, vamos a ver cómo realizar rotación de backups estableciendo un período de retención de X días.


Comando



Podemos eliminar archivos más antiguos de X días mediante el comando find:

HOST# find /ruta/ -type f -mtime +10 -delete

Analicemos sus parámetros:

• find: invocamos el comando find para buscar archivos.
• /ruta/: ruta absoluta hacia el directorio donde se encuentran los archivo a eliminar.
• -type f: solo eliminar archivos (sino, se eliminarían también directorios).
• -mtime +10: eliminar archivos cuyo contenido no haya sido modificado en más de 10 días.
• -delete: eliminar los archivos que cumplan las condiciones anteriormente descritas. Este parámetro siempre debe ir al final de la cadena de parámetros.


Opciones adicionales



Opcionalmente, podemos añadir estos parámetros (y más):

• -mindepth 1: procesar todos los directorios por debajo de la ruta absoluta, excepto los de la ruta en sí.
• -maxdepth X: solo eliminar archivos hasta X niveles (carpetas) por debajo de la ruta absoluta.
• -name "*.bak": eliminar solamente archivos con extensión .bak.


Alternativa



Alternativamente, podríamos usar el comando find con el parámetro -exec si la opción -delete no estuviera disponible en el sistema operativo o la shell que estemos usando.

Para usar la opción -exec, debemos invocarla de la siguiente manera:

HOST# find /ruta/ -type f -mtime +10 -exec rm {} \;

Decir que con este parámetro tendremos problemas si los nombres de archivo tienen espacios, comillas, etc. por lo que es aconsejable usar la opción -delete en vez de -exec rm {} \; a la hora de invocar el comando find para eliminar archivos, siempre que sea posible.


Reflexión final



Antes de usar la opción -delete no estaria de más ejecutar el comando sin esa opción, lo cual nos mostrará por pantalla la lista de archivos que encuentra. Una vez hayamos configurado opciones como mindepth, name y type a nuestro gusto y hayamos verificado qué archivos se van a eliminar, ya podemos usar -delete para eliminar esos archivos de forma segura.


Fuentes:

https://unix.stackexchange.com/questions/194863/delete-files-older-than-x-days
https://www.geeksforgeeks.org/mindepth-maxdepth-linux-find-command-limiting-search-specific...
3

3 comentarios:

  1. Hola! me ha servido mucho tu artículo. Ejecutando como lo recomiendas el comando find en script bash:
    #!/bin/bash

    find directorio1/* -type f -mtime +10
    Me muestra no solo los archivos especificados en directorio1. Me muestra todos los archivos de todos los directorios. Es decir, me muestra los del directorio2/ directorio3/

    Le he puesto entre `` la instrucción y me responde No souch file or directory

    Me puedes orientar al respecto para que solo muestre lo indicado en directorio1. Gracias de antemano por leer.

    ResponderEliminar
    Respuestas
    1. Hola,

      Deberás usar la opción "-maxdepth 1" de este modo:

      find directorio1/* -maxdepth 1 -type f.....

      Como decía en el artículo:

      -maxdepth X: solo eliminar archivos hasta X niveles (carpetas) por debajo de la ruta absoluta. En tu caso, X debe ser 1.

      Saludos

      Eliminar
  2. Muchas gracias por el script, funcionó correctamente. Gracias por compartir.

    ResponderEliminar