Los superpoderes de aptitude

Acabo de descubrir la mejor manera de purgar los paquetes eliminados.

Me diréis ¿pero ahora te enteras? Sí, ahora me entero. Yo hasta ahora usaba el método de toda la vida: buscar los paquetes eliminados pero no purgados y pasar el nombre del paquete a una herramienta para que los purgue. Hay mil y un variantes de este método, que cambian únicamente en la manera de obtener los paquetes, extraer el nombre, o la herramienta usada para purgar. Por ejemplo, tenemos el clásico:

for i in `dpkg -l | grep ^rc | cut -d" " -f 3`; do dpkg -P $i; done

Donde se usa el típico dpkg -l | grep ^rc para listar los paquetes eliminados pendientes de purgar, el comando cut para extraer el nombre del paquete, y dpkg para purgar, todo ello controlado por un bucle for del shell. De esta base se pueden hacer cambios para usar awk en vez de cut, o usar apt-get purge o aptitude purge en vez de dpkg -P, o emplear pipes junto a xargs para el control. Ejemplo:

dpkg -l | grep ^rc | awk '{ print $2; }' | xargs aptitude purge -y

Hay variantes que son scripts, con control de errores, etc, pero la base es la misma.

Hasta hoy, que me he encontrado esto:

aptitude purge ~c

¡Ohhhhhhhhhhhhhhhhh!

Si queréis saber cómo funciona, ~c es un condición de búsqueda, conocida como "término", que filtra los paquetes que han sido eliminados pero no purgados. Por ejemplo, esta orden:

dpkg -l | grep ^rc

es equivalente a esta otra orden:

aptitude search ~c

sólo que en el primer caso es una búsqueda textual de líneas que empiezan por "rc". Si el formato de dpkg -l cambiara por alguna razón, esta orden dejaría de funcionar como se espera, mientras que la segunda orden está realmente diciéndole a aptitude que busque paquetes con cierto estado concreto.

Hay muchos más términos de búsqueda útiles, consultad la referencia de términos de búsqueda para un listado completo. Aquí sólo comentaré uno muy útil: ~i para los paquetes instalados. Así por ejemplo:

aptitude search ~i

es equivalente al típico dpkg -l | grep ^ii (pero sin usar grep). Y para contar paquetes instalados vale con un:

aptitude search ~i | wc -l

Es incluso más útil para buscar entre los paquetes instalados sin tener que recurrir a dpkg -l y grep:

$ aptitude search "~i linux-image"
i   linux-image-3.11.4-amd64        - Linux kernel binary image for version 3.11.4-amd64
i   linux-image-3.11.5-amd64        - Linux kernel binary image for version 3.11.5-amd64
i A linux-image-3.2.0-3-amd64       - Linux 3.2 for 64-bit PCs

en este caso las comillas son necesarias, si no no funcionará como se espera. Observesé una pequeña ventaja frente al listado mediante dpkg, y es que en este caso se indican los paquetes que se han instalado automáticamente por dependencias (la A).

Si eliminamos el término ~i hacemos la misma búsqueda pero sobre todos los repositorios que tengamos configurados, estén los paquetes instalados o no (es el equivalente al apt-cache search):

$ aptitude search linux-image
v   linux-image                       -
p   linux-image-3.10-3-amd64          - Linux 3.10 for 64-bit PCs
p   linux-image-3.10-3-amd64-dbg      - Debugging symbols for Linux 3.10-3-amd64
p   linux-image-3.10-3-rt-amd64       - Linux 3.10 for 64-bit PCs, PREEMPT_RT
p   linux-image-3.10-3-rt-amd64-dbg   - Debugging symbols for Linux 3.10-3-rt-amd64
v   linux-image-3.11                  -
p   linux-image-3.11-trunk-amd64      - Linux 3.11 for 64-bit PCs
p   linux-image-3.11-trunk-amd64-dbg  - Debugging symbols for Linux 3.11-trunk-amd64
i   linux-image-3.11.4-amd64          - Linux kernel binary image for version 3.11.4-amd64
i   linux-image-3.11.5-amd64          - Linux kernel binary image for version 3.11.5-amd64
i A linux-image-3.2.0-3-amd64         - Linux 3.2 for 64-bit PCs
p   linux-image-amd64                 - Linux for 64-bit PCs (meta-package)
p   linux-image-rt-amd64              - Linux for 64-bit PCs (meta-package), PREEMPT_RT

Con este nuevo descubrimiento, mi rutina de actualización diaria de paquetes va a quedar así:

aptitude update && aptitude upgrade
aptitude search ~c
aptitude purge ~c # (si es necesario)
aptitude autoclean

Y encima no necesito hacer autoremove como necesitaría hacer en caso de usar apt-get.

Además, aptitude tiene más ventajas, como los comandos why y why-not, el interfaz de menú (que te permite saber qué paquetes obsoletos tienes instalados), y sobre todo una forma más inteligente de resolver conflictos de dependencias. Por todo esto y más es "la herramienta preferida para el trabajo diario con paquetes desde línea de comandos", según la propia FAQ de Debian.

Y además, contrariamente a lo que él mismo dice, aptitude sí tiene poderes de super vaca. O algo por el estilo...

:wq

blogroll

social