Luego de unos años de uso es común que una instalación de GNU/Linux acumule un buen número de paquetes instalados. Esto, más allá de incrementar el uso de espacio en disco, hace que se acumulen el número de dependencias, conflictos y volumen de las actualizaciones (lo cual implica aumento del tráfico de red y tiempo en cada actualización, y entorpece el mantenimiento del sistema). Claro que esto es culpa 99% del usuario. en mi caso ocurre que instalo aplicaciones, dejo de usarlas, y luego me olvido de ellas. Por esta razón se me ocurrió obtener una lista de paquetes instalados manualmente por mí para hacer una limpieza de aquellos que ya no uso, o de aplicaciones que no me interesan.

Afortunadamente, el gestor de paquetes APT mantiene un log con el historial de todos los comandos ejecutados desde la instalación fresca del sistema en /var/log/apt/history.log. Por cada entrada guarda la fecha en una línea y el comando ejecutado en otra. Este log crece con el paso del tiempo y es común que sea compactado por logrotate.

Ahora bien, el problema es discriminar los comandos ejecutados por el instalador de aquellos ejecutados por el usuario. Sin embargo, el instalador (al menos el de Devuan) ejecuta los comandos de apt-get con una serie de parámetros especiales: estos son "--yes y --force-yes", tal como se observa en las primeras líneas de la siguiente salida:

root@vaio:~# grep Commandline /var/log/apt/history.log | head -n 15
Commandline: apt-get --yes --force-yes install devuan-keyring debian-keyring ca-certificates initramfs-tools e2fsprogs bzip2 curl less vim nano sysvinit
Commandline: apt-get --yes --force-yes install apt-utils parted openssh-server openssh-client sudo alsa-base alsa-utils mawk tmux screen openntpd wpasupplicant wireless-tools elinks firmware-linux-free btrfs-tools zsh rsync git-core lsof bash-completion texinfo acpi-support-base aptitude apt-listchanges discover dnsutils doc-debian docutils-common docutils-doc ftp gettext gnupg2 gparted grub-pc iw laptop-detect mlocate mutt ncurses-term nfs-common procmail reportbug telnet usbutils w3m whois
Commandline: apt-get --yes --force-yes purge btrfs-tools debian-keyring elinks elinks-data git git-core git-man liberror-perl libfsplib0 libtre5 openntpd openssh-server openssh-sftp-server tmux zsh zsh-common
Commandline: apt-get --yes --force-yes autoremove
Commandline: apt-get --yes --force-yes upgrade
Commandline: apt-get --yes --force-yes install live-config live-config-sysvinit syslinux syslinux-common isolinux rsync squashfs-tools xorriso cryptsetup memtest86+ task-desktop task-english task-xfce-desktop task-print-server popularity-contest b43-fwcutter firmware-atheros firmware-b43-installer firmware-b43legacy-installer firmware-bnx2 firmware-bnx2x firmware-brcm80211 firmware-intelwimax firmware-iwlwifi firmware-libertas firmware-linux-nonfree firmware-myricom firmware-netxen firmware-qlogic firmware-ralink firmware-realtek firmware-ti-connectivity firmware-zd1211
Commandline: apt-get --yes --force-yes install dialog live-boot live-boot-initramfs-tools
Commandline: apt-get --yes --force-yes install linux-image-amd64
Commandline: apt-get upgrade
Commandline: apt-get dist-upgrade
Commandline: apt-get autoremove
Commandline: apt-get install fglrx-driver
Commandline: apt-get install youtube-dl
Commandline: apt-get install ffmpeg
Commandline: apt-get purge youtube-dl

Para obtener entonces la lista de todos los paquetes instalados manualmente por el usuario (yo) basta con filtrar el log de APT utilizando grep:

# grep "apt-get install" /var/log/apt/history.log

Por ejemplo:

root@vaio:~# grep "apt-get install" /var/log/apt/history.log | head -n 10
Commandline: apt-get install fglrx-driver
Commandline: apt-get install youtube-dl
Commandline: apt-get install ffmpeg
Commandline: apt-get install virtualbox
Commandline: apt-get install tree
Commandline: apt-get install ntp
Commandline: apt-get install console-data
Commandline: apt-get install ntpdate
Commandline: apt-get install atop
Commandline: apt-get install nmap

Con un simple oneliner empleando cut y tr es posible recuperar únicamente los nombres de paquetes:

root@vaio:~# grep "apt-get install" /var/log/apt/history.log | grep -v 'fix-broken' | cut -d' ' -f4 | tr '\n' ' '; echo
fglrx-driver youtube-dl ffmpeg virtualbox tree ntp console-data ntpdate atop nmap nethogs tcpdump lynx htop unrar flex bison gpp libstdc++-6-dev g++ gtkwave fdupes openshot sg3-utils ncdu geany openvpn youtube-dl vlc rename virtualbox-6.1 strongswan freerdp2-x11 nextcloud-desktop retext texmaker texlive-lang-spanish geany-plugin-spellcheck tmux cheese apt-file chromium recordmydesktop clamav scribus kazam phototonic ephoto nomacs webcamoid eyed3 wine wine32 rawtherapee 

Si el log de APT ha sido rotado, será necesario buscar en todas las copias comprimidas del mismo, empleando zcat en conjunto con cat:

# ( zcat /var/log/apt/history.log*.gz; cat /var/log/apt/history.log ) | grep "apt-get install"

Por supuesto esto vale solamente para aquellos paquetes que han sido instalados ejecutando apt-get install. Si se ha empleado aptitude o apt deberá realizarse otro tipo de búsqueda en este log.

Compartí este artículo