Non ho visto nessuna soluzione funzionare per me, ho installato alcuni pacchetti deb con dpkg e mancavano alcuni degli elementi che stavo cercando in particolare.
Un liner piuttosto lungo, ma comodo da copiare e incollare sarebbe:
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
Il comando precedente salva un elenco di pacchetti in un file nella directory di lavoro corrente denominata my-packages
.
Spiegazione
Ho prima creato un elenco di pacchetti che componevano la linea di base dei pacchetti selezionati durante l'installazione.
zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial
Seguito da un lungo elenco di elementi installati in generale.
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
Ho quindi confrontato i due file initial
ed installed
elencare solo gli elementi univoci da installare.
comm -23 installed initial > custom
Da lì ho voluto filtrare le dipendenze, è qui che questo metodo può perdere alcuni pacchetti desiderati, non è a conoscenza delle dipendenze che sono anche esplicitamente installate.
Ho scritto una rapida funzione bash per abbreviare questi passaggi nell'elaborazione di questi elementi.
function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }
Successivamente ho passato ogni riga dal mio file custom
in questa funzione con xargs
.
echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps
Una volta che ho avuto la lunga lista di tutte le possibili dipendenze, (non sono sicuro su ogni possibile affermazione), ho ancora una volta ottenuto le righe che erano uniche per un singolo file.
comm -23 custom deps > manual
E il mio elenco completo di pacchetti è ora in un file denominato manual
disponibile per la revisione.
something
e nonsomething-common
altrettanto.