Je voudrais obtenir une liste des paquets installés manuellement par apt
ou aptitude
et savoir si un foobar
paquet a été installé manuellement ou automatiquement. Existe-t-il un moyen intéressant de le faire depuis la ligne de commande?
Je voudrais obtenir une liste des paquets installés manuellement par apt
ou aptitude
et savoir si un foobar
paquet a été installé manuellement ou automatiquement. Existe-t-il un moyen intéressant de le faire depuis la ligne de commande?
Réponses:
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.
Utilisant apt-mark
:
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Utilisant 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 restent encore entre les mailles du filet, bien que je suppose que ceux - ci sont réellement installés par l'utilisateur, soit juste après l'installation via la configuration de la localisation de la langue ou, par exemple, via l'installateur de codecs Totem. De plus, 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
bandes supplémentaires éliminent les espaces blancs restants en fin de ligne.Les autres possibilités ne fonctionnent pas aussi bien:
ubuntu-14.04-desktop-amd64.manifest
fichier ( ici 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 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é).
/var/log/installer/initial-status.gz
manque. Aussi, je veux savoir si cela dépend de l'apts manual
ou non?
showmanual
commande (ci-dessous). Et utilisez comm
pour comparer les deux listes (triées). Le showmanual
résultat m'a donné 1840 paquets plus uniques de apt-mark showmanual
non représentés par cette méthode. AUCUN paquet n'était spécifique à la sortie de cette comm
commande. Je pense qu'il est plus intéressant d'enregistrer que pour mon PC, 894 paquets sont listés dans Les deux résultats. Je ne sais pas pourquoi il y a une telle différence. Certains (beaucoup?) Paquets semblent être spécifiques à la version. D'autres comme XOrg, les composants GTK et d'autres lib*
choses pourraient être mises à jour. Quoi qu'il en soit, cette réponse est un très bon début.
apt-mark showmanual
. C'est intéressant de voir combien de différences sont visibles. Votre liste contient 238 paquets, tandis que showmanual en retourne 1717. Sur les 2179 paquets installés, il n'y en a que 223 dans les deux listes, 15 le sont dans la vôtre (exemples: nodejs, lightdm) et 223 dans le fichier showmanual (exemples: xserver-xorg, ubuntu-desktop). Il semble que votre liste soit plus utile, mais sans savoir d'où viennent ces différences, il n'est pas facile de décider ... (mais je suis sûr que j'ai installé manuellement nginx et lightdm ...) [désolé, je viens d'écrire le même;)]
Dans les versions plus récentes du paquet apt, il y a aussi la commande apt-mark
apt-mark showmanual
linux-image-3.11.0-*-generic
etc comme manuel
linux-image-3.13.0-24-generic
est manuel mais le courant linux-image-3.13.0-27-generic
est automatique. Il semble qu'une mise à jour d'un package de référencement (dans ce cas linux-image-generic
, qui a changé les dépendances), la marque manuelle est automatiquement définie
apt-get autoremove
. Ce n'est certainement pas ce que vous voulez.
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. Mettez 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 prend aptitude
ou non. Il ne semble pas que les installations de l'application de bureau Ubuntu Software soient récupérées.
apt-mark showauto | grep -iE '^foobar$'
affichera "foobar" si le paquet a été installé automatiquement, rien sinon.
aptitude search '!~M ~i'
listera les paquets qui n'ont pas été installés automatiquement. Dommage qu’aptitude ne fasse pas partie de l’installation par défaut sur Ubuntu Desktop à partir de 10.10.
aptitude search
montre TOUS les paquets pas seulement ceux qui sont installés manuellement (je suppose que c'est ce que l'OP voulait)
aptitude search '!~M ~i'
et il répertorie 1043 paquets. Il n’ya aucun moyen d’installer autant de paquets manuellement.
Le script suivant imprimera tous les packages qui ne sont pas configurés pour une 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.
sys.exit(1)
sans import sys
peut entraîner une erreur dans les versions plus récentes de python. Soit import sys
ou utiliser exit(1)
.
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
utilisez 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 qui ont été 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 uniquement des commandes utilisateur et de leurs dépendances, ainsi que pour obtenir des informations supplémentaires telles que la version et l'architecture prises en charge (x86, x86_64, amd64, tous, etc.)
Comme plusieurs personnes l'ont commenté, apt-mark showmanual semble être un peu bogué (et je l'ai signalé comme bogue 727799 ). Lorsque je l'utilise, il signale 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.
sys.exit(1)
sans import sys
peut entraîner une erreur dans les versions plus récentes de python. Soit import sys
ou utiliser exit(1)
.
Je voudrais donner une solution graphique.
Ouvert Synaptic Package Manager
Aller à 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 Custom Filters
pour savoir si un foobar
paquet 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 en dessous, Installed (manual)
il a été installé manuellement.
Si personne ne vous répond gentiment en utilisant une commande apr-quelque chose, vous pouvez le faire à la dure . 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.
apt-get install liferea
et il n'a pas été installé, mais j'ai obtenu une sortie qui ressemblait à "marquée comme installée manuellement". À présent, liferea est toujours dans le fichier, sauf que la ligne suivante a un 0
au lieu de 1
. En outre, vous devriez changer votre motif de regex à la " foobar$"
place de juste foobar
.
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
sort -u
au lieu de sort | unique
. Comme l’ apt-mark
architecture n’a pas été affichée, vous devriez la supprimer de la sortie de dpkg avant les opérations définies (ou leur utilisation dpkg-query -W -f='${Package}\n'
). En outre, dpkg peut lister certains paquets qui ne sont pas installés actuellement. En ce qui concerne "desc", vous pouvez utiliser `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack, ce qui est plus rapide.
apt-mark
peut afficher l’architecture de certains paquets, mais pas autant dpkg -l
.
apt-cache search
est lent. Obtenir une liste des dates installées à l'avance en utilisant quelque chose comme help.ubuntu.com/community/ListInstalledPackagesByDate pourrait être plus efficace
Comme l'a dit Li Lo, vous apt-mark showauto
devriez avoir 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: il s’agit plus d’une illustration de la façon dont vous allez avoir l’air génial de donner des ordres énormes à 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
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)
est bien mieux;)
Ceci listera tous les packages installés manuellement sans: dépendances, packages désinstallés, packages installés lors de l'installation du système.
unopts() {
in=`cat`
echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}
list() {
cat '/var/log/apt/history.log' |
grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
egrep --color=never "Commandline: apt-get.* $1" |
sed -r "s/Commandline: apt-get//;s/ $1//" |
unopts |
tr ' ' '\n' |
sed '/^$/d'
}
hapt() {
tmp=`mktemp -d`
installed=$tmp/installed
deleted=$tmp/deleted
dpkg=$tmp/dpkg
list 'install' > $installed
list '(remove|purge|autoremove)' > $deleted
dpkg --get-selections |
grep -v 'deinstall' |
cut -f 1 > $dpkg
while read package
do
sed -i "0,/$package/{//d;}" $installed
done < $deleted
while read package
do
if [ -z "`grep --color=never "^$package$" $dpkg`" ]
then
sed -i "0,/$package/{//d;}" $installed
fi
done < $installed
cat $installed
rm -r $tmp
}