Documentation sur les fonctionnalités poussées d'aptitude et des exemples concrets d'utilisation
# la façon de faire une recherche à l'aide d'aptitude est par défaut limitée au nom et description du programme par rapport à apt-cache qui va élargir la recherche à la description longue
$ aptitude search 'theora'|wc -l
6
$ apt-cache search 'theora'|wc -l
26
# si on veut obtenir la même chose avec aptitude, il faut alors utiliser l'option ~d ou ?description(...)
$ aptitude search '~dtheora'|wc -l
26
# et pour que apt-cache imite le comportement d'aptitude en limitant la recheche aux noms des paquets uniquement
$ apt-cache --names-only search 'theora'
# l'ordre des motifs de recherche et la façon dont ils sont groupés est important
aptitude search 'chaîne1 chaîne2 chaîne3' # opère un ET (AND) entre les 3 motifs (plus précis donc moins de résultats)
# tandis que
aptitude search chaîne1 chaîne2 chaîne3 # opère un OU (OR) entre les 3 motifs (plus large et plus de résultats)
# voici donc 3 façons d'effectuer une recherche qui donne le même résultat :
# les chaînes "tool" et "network" (respectivement dans le nom et nom+description du paquet) ou utilit* (pour trouver le singulier ou pluriel) dans le nom du paquet
aptitude search 'tool ~dnetwork' utilit
aptitude search '(tool ~dnetwork) | utilit'
aptitude search '?or(?and(tool,?description(network)),utilit)'
# attention : la limite d'une recherche à partir de mots-clés est que sur une installation localisée (en français par ex.), il faut rechercher le motif dans les 2 langues (en anglais et dans la langue dans laquelle aptitude est sensée renvoyer les résultats) :
$ aptitude search '~dnetwork ~dtool ~i !~slib !~M' | wc -l
23
$ aptitude search '~doutil ~dréseau ~i !~slib !~M'|wc -l
13
# …à moins que l'on force la recherche en anglais :
$ LANG=C aptitude search '~dnetwork ~dtool ~i !~slib !~M'|wc -l
37
# n.b. : la différence de 1 entre la recherche tout en anglais (LANG=C) et les 2 autres vient du fait que gnumeric a une description francisée mais le logiciel fait partie du projet GNOME (GNU Network Object Model Environment) et forçant la langue anglaise, on trouve les mots 'Network' et outil bien que ça ne soit pas à proprement parlé un outil réseau
# par conséquent, il est préférable d'utiliser les autres moyens de recherche (étiquettes/tags, section) dans la mesure du possible pour ne pas risquer de manquer des résultats escomptés
# mais on risque aussi de ne pas trouver ce que l'on cherche soit parce que le paquet est mal taggué voire pas taggué du tout (ex. avec le dépôt deb-multimedia.org)
# ce qui est intéressant de noter, c'est que souvent les mots-clés recherchés n'apparaissent pas forcément dans la description
# et qu'il est par conséquent recommandé d'utiliser les tags lorsque c'est possible
# par ex, si l'on considère les paquets qui ont le tag "use:editing", il y en a plusieurs centaines qui n'ont pas le mot "edit" dans la description
$ LANG=C aptitude search '~Guse::editing !~dedit'|wc -l
322
# n.b. : il faut installer le paquet 'debtags' pour accéder aux étiquettes/tags
# Attention : les étiquettes que l'on consulte et servent de critères de recherches (~G) sont surtout renseignés pour les paquets des dépôts officiels
# ...et encore, même pas pour la majorité d'entre eux (cf. http://debtags.alioth.debian.org/todo.html )
# ça veut dire qu'il ne faut surtout pas se baser exclusivement sur ces derniers pour trouver les logiciels recherchés
# au final, l'intérêt d'utiliser aptitude vient du fait qu'il remplace avantageusement les nombreux autres (dpkg, apt-get, apt-cache, debfoster, apt-rdepends, dpkg-query, etc.) sans avoir besoin d'utiliser des trésors d'ingéniosité (boucles, pipe ou commandes imbriquées)
# cela permet par conséquent de faire n'importe quelle opération d'installation, purge, mise à jour, verrouillage en 1 seule commande en ligne grâce au(x) motif(s) de recherche qui sont utilisés
# TODO
# réinstallation de tous les paquets OpenOffice installés
aptitude reinstall '~i openoffice*'
# installer les mises à jour en attente des paquets ssh
aptitude install '~U ssh'
# nettoyer les fichiers de config des paquets qui n'ont pas été purgés (et donc encore installés sur la machine)
aptitude purge '~c'
# …c'est quand même moins crade que ça :
# dpkg --purge $(COLUMNS=200 dpkg -l | grep "^rc" | tr -s ' ' | cut -d ' ' -f 2)
# (5 commandes dans 3 pipes et 1 sous-shell qui ne marchent même pas dans tous les cas de figure)
# ou bien pour désinstaller (sans purger les fichiers de conf) tous les bibliothèques obsolètes et qui ne sont pas nécessaires au système
aptitude remove '~o ~slibs ~M !~prequired'
# attention : si on utilise le filtre '~o' seul (pour tous les paquets obsolètes, càd. qui ne sont pas référencés dans un dépôt), ça peut avoir comme conséquence de retirer des paquets installés à l'aide de dpkg -> ceux installés à la main / hors apt
# pour marquer comme ayant été "installés automatiquement" les paquets appartenant à la section 'libs'
aptitude --safe-resolver markauto '~slibs'
# si on veut ratisser plus large en incluant aussi les bibliothèques de développement (libdevel) ainsi que purger les fichiers de conf associés aux paquets en question :
aptitude --purge-unused --full-resolver markauto '~slib'
# Attention : cela peut avoir des conséquences non voulues au prochain autoremove qui va demander la désinstallation de paquets nécessaires au développement ou bien des paquets tels que libdvdcss2 utiles à la lecture de DVD protégés (quoique probablement interdits dans certains pays)
# pour lister les paquets de polices de caractères non virtuels qui devraient être a priori associés à la section fonts
aptitude search '(~n^ttf- | ~n^otf- | ~n^fonts- | ~n^xfont) !~sfonts'
# ainsi que les paquets de la section 'fonts' et dont le nom ne commence pas par font, xfont ou ttf-
aptitude search '!(~n^ttf- | ~n^otf- | ~n^fonts- | ~n^xfont) ~sfonts'
# Recherches avancées
# ~~~~~~~~~~~~~~~~~~~
# liste la plus concise possible des paquets qui sont installés (peut servir à cloner une machine)
# -> paquets installés manuellement, sauf essentiels et obsolètes (qui sont encore pointés par un dépôt)
# n.b. : si on a effectué la commande précédente (markauto), "!~slib" est redondant
aptitude search '~i !~M !~E !~o !~slibs !~soldlibs'
# la même en un peu + minimaliste :
aptitude search '~i !~M !~E !~o !(~prequired | ~pimportant) !(~slib | ~soldlibs | ~Gdevel::library | ~Grole::shared-lib) !~ri386'
# liste les nouveaux paquets utilisables en ligne de commande de la section admin
# qui ne sont pas déjà installés et dont la description contient le mot 'network'
aptitude search '~N ~Ginterface::commandline ~sadmin !~i ~dnetwork'
# renvoie la liste des jeux qui nécessitent OpenGL ou bien ont une interface en 3D
aptitude -F %p search '( ~Ggame | ~sgames) (~Ghardware::opengl | ~Ginterface::3d | ~Gjunior::games-gl | ~Dlibgl1) !~M'|xargs echo
# recherche n'importe quel paquet en rapport avec ssh (dans l'étiquette, le nom ou la description)
# mais sans tenir compte des documentation (section doc), ou des bibliothèques partagées
aptitude search '(~Gprotocol::ssh | ~dssh | ssh ) !~sdoc !~slib !~Gdevel::library !~Grole::shared-lib !^lib'
# les paquets installés manuellement ayant un rapport avec KDE ou qui s'appuient sur la bibliothèque Qt
aptitude search '(~Guitoolkit::qt | ~Gsuite::kde | ~Ddepends:kdelibs) !~slib !~M ~i'
# idem pour les logiciels Gnome/GTK+ qui ne sont pas des bibliothèques de développement avec + d'infos
aptitude -F '%a %c %16p (%r) %v %d' search '(~Guitoolkit::gtk | ~Gsuite::gnome | ~Dlibgtk2 ) !~slib !~n-dev$ !~M ~i'
# pour trouver les paquets installés qui ont une dépendance inverse (reverse depedency) avec une bibliothèque ou un outil (par exemple ffmpeg)
aptitude search '~Ddepends:ffmpeg ~i'
#...et la même chose avec apt-cache, ce qui étrangement ne donne pas un résultat identique
apt-cache rdepends --installed ffmpeg:amd64
# les paquets installés qui ont une version supérieure dans la branche expérimental
aptitude -t experimental search '~U ~i'|wc
# ...et ceux qui sont effectivement installés en versions expérimental
aptitude search '~S ~i ~Aexperimental'
# n.b. : sans le ~S, cela renvoie la liste des paquets qui sont installés et dont une MAJ est possible (et on affiche les 2 versions)
# parmi le dépôt expérimental ou tout autre dépôt non officiel (c.à.d. != Debian)
aptitude -F '%p %25v %25V' search '~i (!~ODebian | ~Aexperimental) !~M ~U'
# commande qui préviens (à mettre dans la crontab) lorsque des paquets + récents sont dispos en expérimental
# (il ne seront pas installés automatiquement vu qu'en général la priorité est + basse)
aptitude -t experimental search '~U ~S ~i !~Aunstable'
# et pour avoir les versions installés/candidates dédits paquets sauf ceux installés automatiquement
aptitude versions $(aptitude -F %p -t experimental search '~U ~S ~i !~Aunstable !~M')
# pour les versions venant de unstable mais n'étant pas disponibles dans testing
aptitude search '~S ~i ~S ~Aunstable !~Atesting'
# paquets en provenance du dépôt deb-multimedia.org sachant que c'est bien ceux là qui sont installés
# (sans le ~S, on a bien les paquets d'une part installés et d'autre part faisant partie du dépôt dmo mais pas forcément l'union des 2)
# -> ~S/narrow permet de faire la combinaison des 2 (requête plus restreinte)
aptitude search '~S ~i ~O"Unofficial Multimedia Packages"' # (donne le mm résultat sans le ~S)
# une autre façon de faire la même recherche :
aptitude -F '%p %25V' search '~S ~i ~V-dmo'
# n.b. la valeur du champ 'origin' vient des fichiers décrivant les paramètres des dépôts /var/lib/apt/lists/*Release
# On peut connaitre les poids de chaque source grace à la commande
apt-cache policy
# et on change les poids / priorités dans les fichiers preferences
# pour trouver la liste des paquets existants en i386 mais pas en amd64
aptitude search '?narrow(?not(?archive("^[^n][^o].*$")),?version(CURRENT))?architecture(i386)'
# vu sur http://anarc.at/services/upgrades/cross-architecture/
# liste les paquets, version et description des paquets installés dont le nom commence par avi
aptitude -F '%p %V %d' search '~i ^avi'
# les paquets susceptibles d'être installés (par conséquent qui ne le sont pas encore) ayant rapport avec des traductions en français ou la "culture française"
aptitude search '(~Gculture::french | -fr$) !~i'
# affiche les paquets installés qui n'appartiennent à aucun dépôt connu (installés manuellement ou paquets orphelins)
aptitude search '~i ~o'
# pour avoir la liste des 649 paquets (au 20090605) qui fournissent/offrent un service :
grep ^Provides: /var/lib/dpkg/available|cut -d: -f2-|tr ',' '\n'|sort -u|tr -d ' '
# et donc, on peut par exemple savoir quels paquets fournissent un service de transport du courrier
aptitude search '~Pmail-transport-agent'
aptitude search '~Dprovides:mail-transport-agent'
# compare avec vimdiff 2 sorties de commande 'aptitude show'
vimdiff <(aptitude show -t unstable flashplayer-mozilla) <(aptitude -t experimental show flashplayer-mozilla)
# TODO
# filtrage résultat sans :i386
# Mises à jour / MAJ
# ~~~~~~~~~~~~~~~~~~
# pour mieux voir les raisons des interdépendances cassées
aptitude -DvV dist-upgrade
# pour voir les paquets candidats à la mise à jour
apt-show-versions -u
# Divers.
# graphe des 25 paquets essentiels au système Linux
apt-cache -o APT::Cache::GivenOnly=true dotty $(aptitude -F %p search '~E'|xargs echo)| dot -T svg | display
# il semble que le meilleur moyen de le faire dorénavant, c'est à l'aide du paquet debtree
debtree --arch=all --no-recommends --no-conflicts dpkg |dot -T png -o out.png ; /etc/alternatives/display out.png ; rm out.png
# la liste des n° de versions des différents paquets disponibles (le truc qui ne sert _strictement_ à rien !)
grep ^Version: /var/lib/dpkg/available|cut -d: -f2-|cut -d: -f2-|cut -d- -f1|cut -d+ -f1|tr -d ' ' |sort -V |uniq -c|sort -gr
# ou en + simple (4 pipes en moins)
sed -n '/^Version:/s/^\(Version: \)\([0-9]*:\)\{0,1\}\([^+-]*\)\([\+\-].*\)\{0,1\}$/\3/p' < /var/lib/dpkg/available |tr -d ' ' |sort -V |uniq -c|sort -bgr
# pour faire une recherche par rapport au n° de version
aptitude -F '%p %25V' search '~S ~Aunstable ~V^4\.2\.2-'
Liste des fichiers de configuration obsolètes
dpkg-query -W -f='${Conffiles}\n' | grep 'obsolete$'
# vu ici : http://www.planet-libre.org/index.php?post_id=20177
# nombre de commandes dans /usr/bin/
apt-file search -x '^/usr/bin/[^/]*$' | wc -l
42514
# (on pourrait aussi y rajouter celles dans /usr/sbin, /sbin et /bin à savoir 4063 + 537 + 286 soit un total 47400)
# statistiques sur les paquets installés / disponibles
apt-cache stats
# calculer le nombre de paquets sources dans la distrib / https://askubuntu.com/questions/103241/how-to-count-the-number-of-source-packages
grep -h '^Package: ' /var/lib/apt/lists/*_Sources | sort -u | wc -l
33048
# (il faut avoir toutes les lignes deb-src correspondantes)
# ou pour liste les paquets suggérés :
dpkg-query -W -f='${Package} (status: ${Status}) suggests: ${Suggests}\n' | grep 'status: install ok installed' | grep -v 'suggests: $'
Ressources
http://algebraicthunk.net/~dburrows/projects/aptitude/doc/fr/ (VF)
http://algebraicthunk.net/~dburrows/projects/aptitude/doc/en/rn01re01.html
http://algebraicthunk.net/~dburrows/projects/aptitude/doc/en/ch02s03s05.html (et pages suivantes)
→ http://algebraicthunk.net/~dburrows/projects/aptitude/doc/en/index.html
http://www.brightonmusic.net/manuals/aptitude/ch02s04s01.html
debtags search → http://raphaelhertzog.com/2010/11/29/how-to-find-the-right-debian-packages-high-level-search-interface/
voir surtout http://debtags.alioth.debian.org/
http://www.debian-administration.org/article/Cloning_a_Debian_system_-_identical_packages_and_versions
d'autres outils basés sur apt dans le paquet debian-goodies :
http://www.commandlinefu.com/commands/tagged/403/aptitude