Trouver tous les paquets installés par l'utilisateur

38

Est-il possible d'obtenir une liste de tous les packages installés par l'utilisateur sur un système Ubuntu, c'est-à-dire les packages installés par-dessus les packages installés par défaut?

(L'idée est d'obtenir une liste complète pouvant être utilisée pour installer les mêmes packages sur une nouvelle installation Ubuntu)

Rabarberski
la source

Réponses:

15

Regardez ces fichiers,

  1. ' /var/log/installer/initial-status.gz' - votre installation principale
    • cette date de fichier serait votre date d'installation (je pense)
    • ' /var/log/dpkg.log' mise à jour de la chronologie (c'est ce que vous voulez)
    • ' /var/log/apt/term.log' - les choses aptmises à jour sur votre système
    • ' /var/cache/apt/archives/'contiendra les debpaquets téléchargés pour l'installation

Mise à jour: utilisez les deux étapes suivantes pour obtenir la liste exacte des nouvelles installations:

  1. exécuter: grep -w install /var/log/dpkg.log > full-list.log
  2. Regardez les lignes au-delà de l' /var/log/installer/initial-status.gzhorodatage

Puisque vous voulez obtenir une nouvelle installation sur un autre système avec ces paquets, vous pouvez même copier les fichiers 'deb' du chemin 'cache / apt / archives' dans celui de la nouvelle installation et les installer en une fois (sans téléchargement). eux encore).

nik
la source
Merci pour le conseil. C'est utile, même si je cherchais plutôt une seule commande pour obtenir cette liste. cat /var/log/dpkg.log | grep 'install' semble se rapprocher si j'ignore les éléments installés jusqu'à la date / heure d'installation
Rabarberski
Ajouter une raison pour le vote négatif aiderait à comprendre un problème dans la réponse, le cas échéant. Cela conduirait également à de meilleures réponses à l'avenir.
Nik
Oeps, le vote négatif était accidentellement le mien. J'avais déjà voté votre réponse. Quand j'ai essayé de marquer votre réponse comme 'finale', j'ai mal cliqué et cliqué sur la flèche vers le bas. Tenter de l'annuler affiche le message: "Le vote est trop ancien pour être modifié, à moins que cette réponse ne soit modifiée." Désolé nik, à la fois pour le vote négatif et la confusion. :-(
Rabarberski
@ Rabarberski, eh bien ça arrive ... pas de mal.
nik
ne fonctionne pas si / var / log / installer n'existe pas, comme lors d'une installation sur un serveur. En outre, il serait logique d’ajouter des NUMÉROS DE VERSION si vous parlez de "Ubuntu" - quel Ubuntu?
8

Juste pour les sourires, j'ai assemblé un one-liner (scindé ici pour plus de clarté) qui décrit les paquets installés manuellement , à l'exception de ceux installés initialement et de tous les paquets installés automatiquement:

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

Cela fonctionne à la fois dans bashet dans zsh.

geekosaur
la source
Cela fonctionne presque parfaitement, sauf qu'il semble imprimer un tas de bibliothèques installées lors de l'installation initiale. Il y a un tas de libtiff, libxcbetc. que je n'ai pas installés moi-même. Cette réponse: superuser.com/a/105000/24349 s’occupe de cela en triant en fonction du temps d’installation et en supprimant tout avant le temps d’installation du système. Super (ab) utilisation de shell!
haxney
3

Sur la base des informations ci-dessus, j'ai écrit un court script Python pour répertorier les packages installés manuellement. Voir ce lien .

N'hésitez pas à l'utiliser, bien que je n'en assume aucune responsabilité. Cependant, les commentaires et les suggestions sont toujours les bienvenus.

Kazark
la source
Brillant! Cela prend un certain temps, mais c'est la seule solution que j'ai trouvée qui fasse exactement ce qu'il me faut!
haxney
2
Malheureusement, le lien est maintenant brisé (affiche un suivi python), ce qui montre l'intérêt de mettre la réponse ici (en particulier pour un "script python court")
David Ljung Madison Stellar
Vous avez trouvé un dépôt avec le script github : github.com/gerjantd/bin/blob/master/… Cliquez sur 'raw' pour le télécharger, puis lancez-le avec 'python list_manually_installed_packages.py'
David Ljung Madison Stellar
2
Le lien de github est maintenant brisé, aussi ...
Suzana
2

Vérifiez ma réponse ici à une question connexe: Comment puis-je afficher la liste de tous les paquets installés sur mon système Debian? . Certaines des autres réponses à la question contiennent également de bonnes suggestions pour obtenir une telle liste.

Cette question devrait faire l’objet d’un doublon, car la question précédente couvrait également cette question, mais il serait peut-être utile de la poser toute seule afin qu’elle soit plus facile à trouver.

Nagul
la source
1

en supposant que vous ayez un historique cohérent et utilisiez aptitude:

history | grep -e "^..... aptitude install"

ne listerait que les paquets que vous avez installés avec aptitude install ... duh

Fehlersturm
la source
1

C'est un travail de bidouille, mais cela fonctionne complètement.

Tout d’abord, allez à http://releases.ubuntu.com/maverick/ (ou quelle que soit la version d’Ubuntu que vous utilisez) et récupérez le fichier *.manifest fileassocié à la version d’Ubuntu que vous utilisez.

Ensuite, exécutez le script suivant (en remplaçant <manifest file>, les chevrons, etc.) par le chemin du fichier que vous avez téléchargé. Vous pouvez toujours ajouter un complément > outputà la fin pour créer un vidage de fichier.

diff --suppress-common-lines <(sed 's/ .*//' <manifest file>) <(dpkg --get-selections | sed 's/[ \t].*//') | grep '>' | sed 's/[>] //'
Arthur Summers
la source
1

Merci geekosaur, beau code. Je l'ai utilisé, mais il a fallu un certain temps pour comprendre comment le faire fonctionner. Voici comment je l'ai fait dans Ubuntu 11.10: cela fonctionne dans le terminal bash:

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  ) > user-installed-packages

Ensuite, pour ajouter un onglet \t- et installsur chaque ligne:

sed 's/$/\tinstall/' user-installed-packages >uip

Puis sur la nouvelle machine:

sudo dpkg --set-selections < uip

Et pour installer les packages:

sudo apt-get dselect-upgrade
jrussell88
la source
0

Pour ce faire, vous pouvez également déterminer ce qui a été installé en fonction de vos "tâches", qui déterminent les packages de base à installer en fonction de vos besoins initiaux.

tasksel --list-tasks

À tout le moins, vous l'auriez server. Cependant, vous pouvez choisir d’en avoir plus. Pour chacune des tâches que vous avez installées, vous pouvez obtenir une liste des packages installés à l'aide de la commande suivante, le tout sur une seule ligne (par souci de clarté) pour ceux que j'ai choisis dans mon installation:

(tasksel --task-packages server ; \
 tasksel --task-packages openssh-server ; \
 tasksel --task-packages lamp-server) | sort | uniq

Une approche générique de ce qui précède serait:

(for a in $( tasksel --list-tasks | grep "^i" | awk '{ print $2 }' ) ; \
 do tasksel --task-packages $a; done) | sort | uniq

Maintenant, utilisez apt-cache depends --installed -i --recurse <packagename> | grep -v "^ "pour obtenir une liste des dépendances utilisées par tous les packages définis dans la tâche. Ceci peut être fait en une ligne comme suit

apt-cache depends --installed -i --recurse \
     $(for a in $( tasksel --list-tasks | \
                   grep "^i" | \
                   awk '{ print $2 }' ) ; \
       do tasksel --task-packages $a; done) | grep -v "^ " | sort | uniq

La liste suivante répertorie tous les packages installés sur votre système (sans compter les dépendances).

dpkg --get-selections | grep "[[:space:]]install" | awk '{print $1}'

Maintenant, utilisez la commcommande pour trouver ceux qui ne figurent que dans la deuxième liste (c.-à-d. Ignorez ceux qui se trouvent dans les deux fichiers et uniquement dans le premier fichier)

comm -13 <(apt-cache depends --installed -i --recurse \
              $(for a in $( tasksel --list-tasks | \
                            grep "^i" | \
                            awk '{ print $2 }' ) ; \
                do tasksel --task-packages $a; done) | grep -v "^ " | sort ) \
         <( dpkg --get-selections | grep "[[:space:]]install" | \
            awk '{print $1}' | sort)
Archimedes Trajano
la source