Je n'ai pas vu de solution ici qui fonctionne pour moi, j'ai installé pas mal de paquets deb avec dpkg et quelques uns des éléments que je recherchais particulièrement manquaient.
Un one liner plutôt long, mais commode à copier et à coller, serait le suivant :
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
La commande ci-dessus enregistre une liste de paquets dans un fichier de votre répertoire de travail actuel nommé my-packages
.
Explication
J'ai d'abord dressé une liste des paquets qui composaient la base des paquets sélectionnés lors de l'installation.
zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial
Suit une longue liste d'éléments installés en général.
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
J'ai ensuite comparé les deux fichiers initial
et installed
pour ne répertorier que les éléments propres à l'installation.
comm -23 installed initial > custom
A partir de là, je voulais filtrer les dépendances, c'est là que cette méthode peut manquer certains paquets désirés, elle n'est pas consciente des dépendances qui sont aussi explicitement installées.
J'ai écrit une fonction bash rapide pour raccourcir les étapes de traitement de ces éléments.
function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }
Ensuite, j'ai passé chaque ligne de mon fichier custom
dans cette fonction avec xargs
.
echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps
Une fois que j'ai eu la longue liste de toutes les dépendances possibles (je ne suis pas sûr de l'expression "toutes les déclarations possibles"), j'ai de nouveau obtenu les lignes qui étaient propres à un seul fichier.
comm -23 custom deps > manual
Et ma liste de paquets terminée se trouve maintenant dans un fichier nommé manual
à ma disposition pour examen.