Je ne voyais aucune solution ici fonctionner, j’ai installé pas mal de paquets deb avec dpkg et quelques-uns des éléments que je recherchais particulièrement manquaient.
Une ligne assez longue, mais pratique pour 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 $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 packages 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 paquets sélectionnés lors de l'installation.
zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial
Suivie d'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
ne répertorier que les éléments uniques à installer.
comm -23 installed initial > custom
À partir de là, je voulais filtrer les dépendances. C’est ici que cette méthode peut manquer certains paquets souhaités, elle n’ignore pas les dépendances qui sont également installées explicitement.
J'ai écrit une fonction rapide bash pour raccourcir cette étape du traitement de ces éléments.
function rdep() { apt-cache rdepends $1 | 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 que j'ai eu la longue liste de toutes les dépendances possibles (je ne suis pas sûr de toutes les déclarations possibles), j'ai à nouveau obtenu les lignes qui étaient uniques à un seul fichier.
comm -23 custom deps > manual
Et ma liste finie de paquets est maintenant dans un fichier nommé manual
que je peux consulter.
something
et passomething-common
aussi bien.