No vi ninguna solución aquí que funcione para mí, he instalado bastantes paquetes de deb con dpkg y faltaban algunos de los elementos que estaba buscando particularmente.
Un revestimiento bastante largo, pero conveniente para copiar y pegar sería:
export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS
El comando anterior guarda una lista de paquetes en un archivo en su directorio de trabajo actual llamado my-packages
.
Explicación
Primero construí una lista de paquetes que componía la línea base de paquetes seleccionados durante la instalación.
zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial
Seguido de una larga lista de elementos instalados en general.
awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed
Luego comparé los dos archivos initial
y installed
enumeré solo los elementos únicos para instalar.
comm -23 installed initial > custom
A partir de ahí, quise filtrar las dependencias, aquí es donde este método puede perder algunos paquetes deseados, no es consciente de las dependencias que también están instaladas explícitamente.
Escribí una función bash rápida para acortar estos pasos en el procesamiento de estos elementos.
function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }
Después de eso, pasé cada línea de mi archivo custom
a esta función con xargs
.
echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps
Una vez que tuve la larga lista de todas las dependencias posibles, (no estoy seguro de cada declaración posible), una vez más obtuve las líneas que eran exclusivas de un solo archivo.
comm -23 custom deps > manual
Y mi lista final de paquetes ahora está en un archivo llamado manual
disponible para que lo revise.
something
y nosomething-common
tan bien.