Comment obtenir une liste de packages obsolètes?

19

J'essaie de trouver un moyen d'obtenir une liste des packages qui ne sont plus disponibles dans les référentiels que j'ai activés. Cette station de travail a utilisé plusieurs versions d'Ubuntu et de nombreux référentiels tiers ont été ajoutés et supprimés. J'aimerais obtenir une liste des logiciels que j'ai de ces référentiels supprimés, afin de pouvoir les nettoyer ou rajouter les référentiels appropriés.

Sean
la source

Réponses:

23
aptitude search '~o'

Aptitude propose des recherches très puissantes. Malheureusement, la syntaxe est un peu lourde et vous devez fouiller la page de manuel pour trouver la documentation, mais ça vaut le coup.

apt-show-versions peut également être utile:

apt-show-versions | grep 'No available version'
Ragoût
la source
1
voir un bel article sur les paquets obsolètes ici: raphaelhertzog.com/2011/02/07/…
Lluís
Une autre liste utile est générée parapt-show-versions | grep "newer than version in archive"
Sean
Je pense que apt-show-versions est le meilleur simplement parce que la ligne d'aptitude est extrêmement contre-intuitive à retenir. Chaque fois que j'en ai besoin, je dois le rechercher sur Google / le rechercher / l'enregistrer / créer un script / etc.
j riv
6

Pour obtenir une liste des applications qui ne se trouvent pas dans un référentiel enregistré ou un PPA, procédez comme suit:

sudo apt-get install apt-show-versions
apt-show-versions | grep 'No available version'

Cela devrait produire du texte comme ceci:

app1 1.0.0.14 installed: No available version in archive
app23 0.3.6 installed: No available version in archive
app332 7.0.9377 installed: No available version in archive

Pour moi, cela a fonctionné et a montré trois applications que j'ai installées à l'aide de packages DEB et qui n'étaient pas disponibles dans un Repo ou un PPA.

N'oubliez pas cependant qu'il est impossible de vérifier tous les programmes, uniquement ceux qui ont été exécutés dpkg. Par exemple, certaines applications sont installées en les extrayant simplement dans les dossiers appropriés, ou d'autres utilisent un bac ou un script d'installation autonome. La meilleure façon est donc pour vous de conserver une liste des applications que vous avez installées via une méthode autre qu'APT.

japzone
la source
Fonctionne pour tous mes dpkgpackages installés localement . Une exception. Il répertorie skype-bin, tandis que apt-cache policy skype-binmontre clairement le repo partenaire Canonical. Je ne sais pas ce qui se passe. Problème multiarchitecture? Toujours +1 pour apt-show-versions!
gertvdijk
aptitude appelle ces packages «obsolètes». Voir le commentaire sur la chronite ci-dessus.
Henk Poley
5

Si vous avez installé aptitude ,

aptitude search '?obsolete'

ou sa forme courte

aptitude search '~o'

Voici un exemple de sortie

i A gcc-4.7-base - GCC, the GNU Compiler Collection (base package)
id  libdb4.7     - Berkeley v4.7 Database Libraries [runtime]
i   libudev0     - libudev shared library

Le premier caractère de chaque ligne indique l'état actuel du package. Les états les plus courants sont:

  • p, ce qui signifie qu'aucune trace du package n'existe sur le système,
  • c, ce qui signifie que le package a été supprimé mais que ses fichiers de configuration restent sur le système,
  • i, ce qui signifie que le package est installé, et
  • v, ce qui signifie que le package est virtuel.

Le deuxième caractère indique l'action stockée à effectuer sur l'emballage, le cas échéant, sinon un espace vide est affiché. Les actions les plus courantes sont:

  • i, ce qui signifie que le package sera installé,
  • d, ce qui signifie que le package sera supprimé, et
  • p, ce qui signifie que le package et ses fichiers de configuration seront supprimés.

Si le troisième caractère est A, le package a été automatiquement installé.

Pour une liste complète des indicateurs d'état et d'action possibles, consultez la section Accès aux informations de package dans le guide de référence d'aptitude.

Demis Palma ツ
la source
1
aptitude search ?obsoletepeut fonctionner en bash, mais vous devez utiliseraptitude search '?obsolete'
AB
pourriez-vous ajouter des détails sur l'analyse de la sortie?
Elder Geek
'? Obsolète' est-il différent de '~ o'?
Sean
@Sean Non, ils ne sont pas différents. ~ o est la forme abrégée de? obsolète en effet.
Demis Palma ツ
Les citations sont analysées par le shell. Je pense que AB voulait dire que vous ne devriez pas passer de caractère étrange sans échapper sur la ligne de commande parce que vous ne savez pas ce que votre shell va faire avec eux.
Sean
2

À partir d'Ubuntu 19.10, il est également possible d'exécuter

apt list ?obsolete

pour obtenir la liste des packages obsolètes.

Pour toute version, vous pouvez utiliser la doublure Bash suivante:

comm -23 <(dpkg-query -W -f '${db:Status-Abbrev}\t${Package}\n' | grep '^.[^nc]' | cut -f2 | sort) <(apt-cache dumpavail | sed -rn 's/^Package: (.*)/\1/p' | sort -u)

Pas besoin d'installer des packages supplémentaires pour cela, plus c'est relativement rapide. Cela trouvera également les packages partiellement installés (mais ne trouvera pas ceux qui n'ont que des fichiers de configuration restants; qui pourraient être modifiés facilement, cependant). Remarque: cela ne tient pas compte de l'architecture des packages.

Si vous souhaitez inclure des packages dont la version installée est différente de celle disponible dans les référentiels, vous pouvez utiliser l'une des options suivantes:

Utilisez apt moderne:

 apt list --installed | awk -F/ '/\[installed,local\]/{print $1}'

Une autre option consiste à exécuter

ubuntu-support-status --show-unsupported

et lisez les noms des packages dans la section "Plus téléchargeable:".

jarno
la source
'apt list --manual-installed | grep -v cosmic 'montre de faux positifs. Cette réponse est bien meilleure!
TamusJRoyce
1
@TamusJRoyce, oui, je suppose maintenant après l'édition.
jarno
1

Plus d'informations pour enquêter.

ubuntu-support-status 
echo "Paquets $ (sudo apt-mark showmanual | wc -l) marqués comme 'installés manuellement'."

... ubuntu-support-status et apt-mark peuvent nécessiter une installation.

Hannu
la source
Pas besoin d'utiliser sudoavec apt-mark showmanual.
jarno
ubuntu-support-statusrépertorie le nombre de packages obsolètes, mais pas les noms des packages.
jarno
1
Lire la sortie deubuntu-support-status --help
Hannu
Oh, merci pour l'allusion.
jarno
0

Il peut y avoir un moyen plus propre, mais du haut de ma tête, vous pouvez le faire

dpkg -l | cut -f 3 -d ' ' > installed
xargs -n 1 --replace=X apt-cache search ^X$ < installed | cut -f 1 -d ' ' > available
diff installed available

Nettoyez les premières lignes du installedfichier: il aura des en-têtes.

Bonus si quelqu'un peut corriger ma coloration syntaxique ...

Jeff Ferland
la source
2
si vous allez utiliser la sortie de dpkg -lpour obtenir une liste des packages installés, vous devez limiter les résultats aux lignes avec 'i' dans la deuxième colonne, car dpkg listera également les packages qui ne sont pas installés (peut-être supprimés mais non purgés) . à titre d'exemple, la modification de votre première commande pour dpkg -l | grep '^.[^i]' | cut -f 3 -d ' ' qu'elle renvoie une liste de packages, qui ne sont PAS installés. (mais une fois)
ragoût le
1
aussi, apt-cache search someinstalledpackageretournera quelque chose même si le paquet n'est pas disponible à partir d'un dépôt, donc je ne pense pas que cela fonctionnera du tout.
ragoût le
1
@stew Je vais laisser ça ici pour voir si quelqu'un arrive à des conclusions, mais votre réponse est certainement bien meilleure. +1 pour vous.
Jeff Ferland le
@stew affiche dpkg -l | grep '^.[^i]' | cut -f 3 -d ' 'également certaines lignes d'en-tête.
jarno
Même si cette réponse fonctionnait, elle serait très lente car elle s'exécuterait apt-cache searchpour chaque package séparément.
jarno
0

Comme mentionné, la recherche apt-get n'est pas une bonne méthode pour vérifier si un package est toujours disponible. J'ai ajouté tout à une seule ligne:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done
wof
la source
Et pourquoigrep '^i'
AB
@AB bon point; cela ne dit pas si le package est installé, mais que l'action souhaitée du package doit être installée. Voir man dpkg-querypour plus d'informations.
jarno
C'est très lent
jarno
apt-cache showne sert ni à vérifier si le colis est disponible. Si vous désactivez le référentiel respectif et qu'aucun autre référentiel activé ne l'a, il affiche toujours le package.
jarno