Bash Scripting (X). Optimizar el Espacio en Disco en Ubuntu

Muy buenas. Ahí va otro post de la serie de Linux Scripting. Ahora que ya conoces el entorno de Bash, la sintaxis básica del lenguaje, los pasos a seguir para crear y ejecutar tu primer script de forma manual, e incluso las formas que tienes para programar la ejecución de tu script en el arranque del sistema, es hora de ir a por la parte de ejemplos prácticos.

Este es el quinto ejemplo práctico de esta serie, . En este caso, crearé un script para realizar una completa optimización de espació en disco, no solo a nivel de paquetes, sino también de archivos temporales, memoria caché, etc. ¡Vamos allá!

Tabla de contenidos:

  1. Descripción y propósito del script
  2. Condiciones de ejecución
  3. Creación del script
  4. Código fuente
  5. Ejecución del script
  6. Programar la ejecución del script
  7. Continuación

Descripción y Propósito del Script

En este ejemplo, como he comentado al principio, te enseñare a programar un script que se encargará de realizar varias tareas con las que realizar una completa limpieza de paquetes que ya no necesarios, así como de sus ficheros de configuración asociados.

El script que crearemos hoy es en cierto modo una extensión del script del ejemplo anterior, en el que viste como realizar una limpieza a nivel de gestor de paquetes. Aquí el objetivo no era tanto optimizar el espacio en disco, sino mantener el gestor de paquetes limpio de paquetes o dependencias obsoletas.

En el script que verás hoy si que me centraré en optimizar el espacio en disco, por lo que, además de incluir la limpieza a nivel de gestor de paquetes, también verás como borrar los registros del diario de systemd, los archivos temporales, la papelera de reciclaje o el caché de miniaturas.

Condiciones de Ejecución

Este script esta pensado para funcionar únicamente en distribuciones que utilicen el formato de paquetería .deb y el gestor de paquetes APT. Esto incluye a todas las distribuciones del universo Debian, incluyendo a la propia Debian, Ubuntu, y a todo el conjunto de sus derivados.

Además, otra consideración a señalar es que el script realiza tareas asociadas a la gestión de paquetes con APT, y que requieren privilegios de superusuario. Por este motivo, verás que utilizo sudo en la mayoría de las sentencias.

Creación del Script

A continuación te dejo los pasos que debes seguir para crear y ejecutar el script, y en el siguiente apartado te dejo el código del mismo, que luego tu mismo podrás adaptar segun tus preferencias.

  1. Abrir un nuevo fichero de texto con tu editor de texto favorito. Puedes utilizar un editor gráfico como Gedit en GNOME, o un editor por consola como Vim.
  2. Copiar el código del script que tienes a continuación, y adaptarl a tus preferencias particulares en caso de que lo desees.
  3. Guardar el archivo en la ubicación que desees dentro de tu Home. El fichero puede tener el nombre que desees, pero debe terminar con la extensión .sh.

Código Fuente

A continuación tienes el código que debes copiar en el fichero recién creado.

#!/bin/bash

# Desinstalar paquetes no necesarios
sudo apt -y autoremove

# Obtener paquetes marcados para ser desinstalados aun presentes en el sistema
paquetes=$(sudo dpkg --set-selections | deinstall)

# Eliminar los paquetes obtenidos como resultado del comando anterior
awk '{print $s1}' <<< "$paquetes" | xargs sudo apt purge -y

# Limpiar archivos de configuración de paquetes paquetes desinstalados y eliminar la cache de APT
sudo apt autoclean
sudo apt-get clean

# Borrar los registros del diario de systemd anteriores a 5 días
sudo journalctl --vacuum-time=5d

# Borrar archivos temporales
sudo rm -rf ~/tmp/*

# Borrar archivos de la papelera de reciclaje
sudo rm -rf ~/.local/share/Trash/*

# Limpiar la cache de miniaturas
sudo du -sh ~/.cache.thumbnails

# Comprimir los archivos de la carpeta de descargas que tengan un tamaño superior a 10 MB
find ~/Descargas -type f -size +10M -exec gzip "{}" \;

Explicación del Código Fuente

Visto el código fuente, a continuación te explicaré que hace cada una de las líneas. Vayamos por partes.

Primero de todo ejecuto el comando sudo apt autoremove, para desinstalar los paquetes que ya no son necesarios en el sistema.

sudo apt -y autoremove

A continuación he declarado una variable denominada paquetes que contendrá el resultado de ejecutar el comando sudo dpkg --get-selections | grep deinstall, que lo que hace es enumerar los paquetes que han sido marcados para desinstalar (aquí típicamente suelen aparecer las versiones anteriores del kernel, a medida que este se va actualizando).

paquetes=$(sudo dpkg --set-selections | deinstall)

El resultado de la variable anterior es un listado de paquetes, donde en la primera columna aparece el nombre del paquete y en la segunda el flag install o deinstall. Por ello, a continuación, aplicaré primero el comando awk '{print $s1}' <<< "$paquetes" para filtrar solo la primera columna, y, sobre eso, ejecutaré un sudo apt -y purge para eliminar cada uno de los paquetes.

awk '{print $s1}' <<< "$paquetes" | xargs sudo apt purge -y

Hecho esto, como siguiente paso puedes ejecutar el comando sudo apt autoclean para realizar un borrado de los ficheros de configuración asociados a todos los paquetes que se hayan eliminado del sistema. Además, si lo deseas, también puedes borrar la cache de APT en su totalidad, con el comando sudo apt-get clean.

sudo apt autoclean
sudo apt-get clean

Otro paso que puedes hacer para eliminar más espacio es borrar los registros del diario de systemd. Los registros del diario de systemd proporcionan datos de registro que pueden ser útiles a la hora de investigar problemas, pero con el tiempo pueden llegar a ocupar un espacio considerable. Por este motivo, puedes eliminar los que sean anteriores a una cierta cantidad de días (en este ejemplo he puesto 5).

sudo journalctl --vacuum-time=5d

Otro paso que no puede faltar es la limpieza de archivos temporales del sistema, a nivel de usuario, y que suelen almacenarse en la carpeta /tmp de dentro de la Home de tu usuario.

sudo rm -rf ~/tmp/*

Ya puestos, también puedes aprovechar para limpiar la papelera de reciclaje:

# Borrar archivos de la papelera de reciclaje
sudo rm -rf ~/.local/share/Trash/*

Otro directorio que suele llenarse mucho, sobretodo si tienes almacenados muchas imágenes o vídeos, es el de cache de miniaturas. Aquí se guardan las imágenes que se han ido generando para todos los archivos de tipo imagen o vídeo. Puede ser útil, sobretodo para no almacenar imágenes de miniaturas relativos a archivos que quizá ya no tengas. Los que sigas teniendo, obviamente, volverán a generar su miniatura cuando consultes el directorio en el que se encuentren almacenados:

sudo du -sh ~/.cache.thumbnails

Finalmente, otra acción que puedes hacer, es comprimir todos los archivos de la carpeta de descargas que superen un cierto umbral de tamaño. En mi ejemplo he puesto que aplique para todos los ficheros superiores a 10 MB.

find ~/Descargas -type f -size +10M -exec gzip "{}" \;

Como puedes ver, con este script podrás automatizar una gran cantidad de tareas que te podrán ser de gran ayuda de cara a optimizar al máximo el espacio en disco, y con un esfuerzo mínimo o incluso nulo (si te decantas por automatizar su ejecución en base una regla de calendario).

Ejecución Manual del Script

Una vez creado y guardado el script, es hora de ejecutarlo. Para ello, tan solo debes abrir una ventana de terminal, situarte en el directorio en el que lo tienes almacenado, y teclear el siguiente comando:

bash nombre-script.sh

Con esto, ya solo queda esperar a que se termine de ejecutar, y te habrás asegurado de haber hecho una buena limpieza de espacio.

Aunque puedes ir ejecutándolo de forma manual, al tratarse de un script que realiza tareas de limpieza, no es mala idea programar su ejecución de forma automática, y olvidarte por completo.

Programar la Ejecución del Script

En este caso, como en otros anteriores, voy a recurrir a Cron para programar la ejecución den script, una herramienta que se utiliza en GNU/Linux y Unix, y que sirve para programar la ejecución de comandos o scripts en el sistema, en base a una fecha y hora específicas. Cron permanece siempre activo y en segundo planto.

Para interactuar con Cron debes hacerlo a través del fichero Crontab, que es básicamente donde se indica toda la relación de scripts y/o comandos que deben ejecutarse de forma automática, en base a la fecha y hora asignadas. Para ver y editar ese fichero, se utiliza el comando crontab tal como indico a continuación:

sudo crontab -e

A continuación se te preguntará, en primer lugar, que tipo de editor quieres utilizar para editar el fichero. Yo he indicado la opción 1, que es la que corresponde a Nano, ya que es el editor por consola que conozco mejor y que me parece más simple e intuitivo de utilizar. Lo siguiente que verás es la interfaz del editor Nano por pantalla, y ya solo queda empezar a editar el fichero.

Para ello, debes especificar cada tarea a ejecutar en una linea aparte. La sintaxis de Cron consta de 5 asteriscos seguidos del comando con la acción a realizar, que en este caso es la ruta donde se encuentra el script. Cada asterisco puedes sustituirlo por un valor concreto, o dejarlo como tal. El primer asterisco es para indicar el minuto (de 0 a 60), el segundo la hora (de 0 a 23), el tercero el día del mes (de 1 a 31), el cuarto el mes (de 1 a 12), y el quinto el día de la semana (de 0, que representa domingo, a 6, que representa sábado).

En este caso concreto, si quieres, por ejemplo, programar el escaneo para cada domingo a las 21 de la noche, deberías indicarlo de la siguiente forma:

0 17 * * 0 /home/usuario/nombre-script.sh

Continuación

Antes de finalizar, te dejo a continuación con todos los posts publicados dentro de esta serie sobre Linux scripting, para que puedas consultarlos si necesitas profundizar en cualquiera de los aspectos teóricos explicados.

  1. Linux scripting. Descubre el enorme poder de automatizar tareas
  2. Linux scripting con Bash. Introducción a Bash
  3. Linux scripting con Bash. Sintaxis del lenguaje
  4. Linux scripting con Bash. Crear y ejecutar tu primer script
  5. Linux scripting con Bash. Ejecutar script en el inicio del sistema
  6. Linux scripting con Bash. Ejemplo 1. Setup post-instalación para Ubuntu
  7. Linux scripting con Bash. Ejemplo 2. Escaneo mensual de malware
  8. Linux scripting con Bash. Ejemplo 3. Realizar un Backup y enviarlo en una unidad externa

Un saludo y hasta la próxima!

Categorías LinuxEtiquetas , , ,

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.

search previous next tag category expand menu location phone mail time cart zoom edit close