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.