Je n'ai vu aucune solution ici travailler pour moi, j'ai installé pas mal de paquets deb avec dpkg et quelques-uns des éléments que je cherchais particulièrement manquaient.
Une seule ligne assez longue, mais facile à copier et à coller serait:
export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print }' > $DPKG_INITIAL ; awk ' !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", ) ; gsub(/:.+/, "", ) ; a[]= } 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 | 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 construit une liste de paquets qui composaient la ligne de base des packages sélectionnés lors de l'installation.
zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print }' > initial
Suivi d'une longue liste d'éléments installés en général.
awk ' !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", ) ; gsub(/:.+/, "", ) ; a[]= } 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 lister que les éléments uniques à installer.
comm -23 installed initial > custom
À partir de là, je voulais filtrer les dépendances, c'est là que cette méthode peut manquer certains paquets souhaités, elle ignore les dépendances qui sont également explicitement installées.
J'ai écrit une fonction de bash pour raccourcir cette étape dans le traitement de ces éléments.
function rdep() { apt-cache rdepends | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }
Après cela, 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 la longue liste de toutes les dépendances possibles (pas sûre de toutes les instructions possibles), j'ai de nouveau obtenu les lignes uniques à un seul fichier.
comm -23 custom deps > manual
Et ma liste de paquets finis se trouve maintenant dans un fichier nommé manual
disponible pour que je puisse l'examiner.