J'aimerais obtenir une liste des packages installés manuellement par apt
ou aptitude
et pouvoir savoir si un package foobar
a été installé manuellement ou automatiquement. Existe-t-il un moyen intéressant de le faire depuis la ligne de commande?
Vous pouvez utiliser l'une ou l'autre de ces deux lignes. Les deux donnent exactement le même résultat sur ma machine et sont plus précis que toutes les solutions proposées jusqu'à présent (6 juillet 2014) dans cette question.
Utilisation de apt-mark
:
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Utilisation de aptitude
:
comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Très peu de paquets tombent encore entre les mailles du filet, bien que je soupçonne que ceux-ci sont réellement installés par l'utilisateur, soit juste après l'installation dans la configuration de la localisation de la langue, par exemple. via l'installateur de codecs Totem. En outre, les versions de linux-header semblent également s'accumuler, même si je n'ai installé que le méta-paquet non spécifique à la version. Exemples:
libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29
Comment ça marche:
sed
supprime les espaces restants à la fin de la ligne.Les autres possibilités ne fonctionnent pas aussi bien:
ubuntu-14.04-desktop-AMD64.manifest
( here pour Ubuntu 14.04) au lieu de /var/log/installer/initial-status.gz
. Plus de paquets sont montrés comme installés manuellement même s'ils ne le sont pas.apt-mark showauto
au lieu de /var/log/installer/initial-status.gz
. apt-mark
par exemple n'inclut pas le paquet xserver-xorg, contrairement à l'autre fichier.J'ai utilisé divers autres postes StackExchange comme référence, mais aucun ne fonctionne aussi bien que la solution ci-dessus:
Les deux listes plus de paquets que la solution ci-dessus.
EDIT: que faire si vous avez mis à jour une version précédente:
Si vous avez mis à jour Ubuntu d’une version à l’autre, vous devrez probablement ajuster ce processus. Dans ce cas, je vérifierais le fichier de manifeste de la nouvelle version (voir ci-dessus) en plus du fichier initial-status.gz de la version actuelle. Vous pouvez facilement le faire en ajoutant simplement une autre comparaison. Utiliser uniquement le fichier manifeste ne fonctionnera pas, car le fichier manifeste ne contient malheureusement pas tout ce que contient le fichier initial_status.gz (j'ai vérifié).
Dans les versions plus récentes du paquet apt, il y a aussi la commande apt-mark
apt-mark showmanual
apt-mark showauto | grep -iE '^foobar$'
affichera "foobar" si le paquet a été installé automatiquement, rien sinon.
aptitude search '!~M ~i'
liste les paquets qui n'ont pas été installés automatiquement. C'est dommage qu'aptitude ne fasse pas partie de l'installation par défaut sur Ubuntu Desktop à partir de 10.10.
Pour Ubuntu 16.04, consultez le fichier journal /var/log/apt/history.log
.
Par exemple:
zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz
Ce n’est pas parfait, mais c’est assez bon pour préciser exactement ce que j’ai installé à la main. Placez un -B 1
sur le grep pour voir quand il a été installé.
Exemple de sortie
Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-Perl libcrypt-openssl-bignum-Perl libcrypt-openssl-rsa-Perl libio-socket-ssl-Perl libnet-ssleay-Perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-Perl
Commandline: apt install Perl-doc
Commandline: apt upgrade
Je ne sais pas si cela détecte aptitude
ou non. Il ne semble pas que les installations de l'application de bureau Ubuntu Software soient récupérées.
Le script suivant imprimera tous les packages qui ne sont pas définis pour l'installation automatique et qui ont donc été installés manuellement:
#!/usr/bin/python
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
il est basé sur la façon dont apt-mark affiche les paquets installés automatiquement.
Comme plusieurs personnes l'ont commenté, apt-mark showmanual semble être un peu buggé (et je l'ai signalé comme bug 727799 ). Lorsque je l'utilise, il rapporte en fait beaucoup de choses qui ne sont même pas consignées dans/var/lib/apt/extended_states (où elles sont censées être stockées) et apt-get ne consigne pas les choses telles qu'elles sont installées dans/var/lib/apt/extended_states (uniquement dans/var/lib/dpkg/status). Le script python de txwikinger ci-dessus tire directement de/var/lib/apt/extended_states mais si vous l'utilisez aujourd'hui, la syntaxe risque de ne pas fonctionner (le mien vient de générer des erreurs avec Kubuntu 13.10). La syntaxe mise à jour est la suivante:
#!/usr/bin/python
import sys
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
Pour moi, c'était une liste très courte de 5 éléments qui ne semble pas être exacte non plus.
Pour obtenir la liste de tous les packages (non installés, installés par l'utilisateur ou installés par défaut, sur tous les PPA), apt
utilise la méthode suivante:
apt list [option]
Les options possibles pour cela sont:
--installed
pour afficher uniquement les packages installés sur le système (sur plus de 50 000)
--manual-installed
pour répertorier les packages explicitement installés par une commande, directement ou sous forme de dépendances.
Alternativement, vous pouvez faire:
apt list --manual-installed | grep -F \[installed\]
pour obtenir une liste des packages résultant des commandes utilisateur et de leurs dépendances uniquement, ainsi que pour obtenir des informations supplémentaires telles que la version et l'architecture prises en charge (x86, x86_64, AMD64, tous, etc.)
Je voudrais donner une solution graphique.
Ouvrez Synaptic Package Manager
Allez à Status
Cliquez sur Installed (manual)
Il donnera la liste des paquets installés manuellement par apt ou aptitude.
Malheureusement, je n'ai trouvé aucune option dans Custom Filters
pour savoir si un paquet foobar
a été installé manuellement ou automatiquement.
Si le paquet est sous Installed
mais pas sous Installed (manual)
, il a été installé automatiquement. Si le paquet est sous Installed (manual)
, il a été installé manuellement.
Si personne ne vous donne une bonne réponse en utilisant une commande apr-quelque chose, vous pouvez le faire à la manière . Apt-get stocke ses informations dans/var/lib/apt/extended_states. Tout fichier installé automatiquement sera ajouté à ce fichier. Si vous installez manuellement un paquet déjà dans ce fichier, le paquet restera dans ce fichier mais avec Auto-installé: 0 à la deuxième ligne. Ce n'est pas supprimé.
Remarque: Comme prévu, de meilleures réponses sont susceptibles de fonctionner si les changements d'emplacement de fichier sont apparus. Je garde le mien au cas où les informations sur l'emplacement du fichier seraient utiles.
Après avoir beaucoup cherché sur Google, j'ai réussi à assembler ce script. Cela fonctionne bien pour moi:
# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)
# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)
# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)
# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )
for pack in $packages; do
packname=$(echo $pack | cut -f 1 -d ":")
desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
date=$(date -r /var/lib/dpkg/info/$pack.list)
echo "# $desc"
echo "# $date"
echo "Sudo apt-get install $pack"
echo -e ""
done
Comme l'a dit Li Lo, apt-mark showauto
devrait vous fournir une liste complète d'éléments automatiquement installés.
Maintenant, pour montrer les choses qui sont installées manuellement, il s’avère qu’il existe un joli modificateur de recherche simple pour aptitude. Mais vous ne voulez pas faire ça. Vous voulez écrire une énorme commande bash qui fait de la science de fusée.
Remarque: Ceci est davantage une illustration de la façon dont vous allez avoir l'air cool de donner des ordres bash massifs à tous vos amis.
comm -3 <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)
Je l'ai cassé sur deux lignes pour plus de lisibilité. Qu'est-ce que cela fait?
apt-mark