J'utilise Arch Linux.
Existe-t-il un moyen de répertorier les dépendances facultatives de tous les packages installés? Et si oui, puis-je filtrer cette liste pour voir uniquement les packages manquants (non installés)?
Vous pouvez utiliser expac pour interroger le pacman
database.
Quelque chose comme:
awk 'NF>=2' <(expac "%n %O") > optdeps
imprimera une liste de tous les packages installés sur votre machine et le optdepends
pour chacun (%O
)1 à un fichier appelé optdeps
. Vous pouvez ensuite trier cela contre une liste des packages OptDepends installés.
Voir man expac
Pour la liste complète des options.
1. C'est une majuscule O, pas un zéro. Parce que nous ne peut avoir une police qui se distingue entre les deux ...
Il y a un bel utilité dans le référentiel Aur (Aur/Pacdep).
pACDEP a beaucoup d'options - un exemple - trouver des packages facultatifs pour "thunar-archive-plugin":
> pacdep -oppp thunar-archive-plugin
[...]
Optional dependencies: 6.16 MiB
extra/file-roller 3.89 MiB
extra/kdeutils-ark 1.12 MiB
community/xarchiver 1.16 MiB
[...]
La sortie ci-dessus signifie qu'aucun des packages en option n'est installé. Après avoir installé "xarchiver", la sortie ressemble à
[...]
Optional dependencies: 6.16 MiB
local: 1.16 MiB
xarchiver 1.16 MiB
sync: 5.01 MiB
extra/file-roller 3.89 MiB
extra/kdeutils-ark 1.12 MiB
[...]
J'ai trouvé (la première partie de) cette réponse sur
[.____] http://mywaytoarch.tumblr.com/post/34979742718/easily-list-package-depends
Ce n'est pas exactement efficace, mais trouvera ce que vous voulez (en couleur!):
pacman -Q > /tmp/paccache
for pkg in $(awk '{print $1}' /tmp/paccache) ; do
echo -n "$pkg => ";
for dep in $(pacman -Qi $pkg | awk -F: '/Optional Deps/{gsub(/[\<\>=].*/,"");print $NF;}' ) ; do
grep -q "$dep" /tmp/paccache && COLOR=32 ; echo -en "\e[1;${COLOR:-31}m${dep}\e[0;m " ; unset COLOR ;
done
echo
done
Cela devrait faire l'affaire:
comm -23 <(expac -l"\n" "%o" | sort -u) <(expac -l"\n" "%n\n%S" | sort -u)
Première entrée à comm
répertorie toutes les dépendances facultatives, deuxième entrée Tous les packages installés et leurs attributs "Fournir". Les deux listes sont triées et contiennent chaque élément une seule fois en raison de sort -u
. Ensuite, seules les lignes sont montrées qui sont contenues dans la première mais pas dans la deuxième liste.
(édité pour incorporer la suggestion de @ Archemar)
Bien que j'ai dû remarquer que la solution de @ Darkheart ne fonctionne pas vraiment, cela m'a inspiré de faire un travail en activité. (pas de couleurs, cependant)
J'utilise Requête-package , un outil similaire au lieu d'expac qui a été suggéré par @jasonwryan, car je l'avais déjà installé (c'est une dépendance de Yaourt). Il devrait être trivial pour changer cela pour utiliser Expac à la place.
La liste de toutes les dépendances facultatives est principalement effectuée par l'appel à la requête de package. La première boucle supprime les explications, de sorte que les noms de colis des dépendances facultatifs restent; La deuxième boucle supprime les dépendances déjà installées dans sa première ligne avant d'imprimer les résultats dans le second.
#!/usr/bin/Perl
use strict;
use warnings;
my %deps;
for (`package-query -Q -f'%n %O'`) {
$deps{ (/^(\S+)/)[0] } = [/(\S+):/g];
}
my @pkgs = keys %deps;
for my $pkg (@pkgs) {
my @missing_deps = grep { !($_ ~~ @pkgs) } @{ $deps{$pkg} };
print "$pkg => @missing_deps\n" if @missing_deps;
}
Parfois, vous devez travailler à l'envers ... Tout d'abord trouver tout non-optionnel dépend, puis une référence croisée avec la liste complète, puis utilisez UNIQ. Cela générera une liste de facultatif installée dépend.
Trouver tous installés
pacman -Q
Trouvez tous les non-facultatifs:
pacman -Qent
Les entrées uniques doivent donc être facultatives:
(pacman -Q; pacman -Qent) | sort | uniq -u
Générer une liste de facultative manquante dépend des descriptions, pas jolie, mais cela fonctionne.
pacman -Q > /tmp/paccache; for pkg in $(awk '{print $1}' /tmp/paccache); do pacman -Qi $pkg | grep "^Optional Deps" | grep -v None >/dev/null && echo $pkg >> /tmp/hasdeps; done
for pkg in $(awk '{print $1}' /tmp/hasdeps); do echo -ne "Package: $pkg ___ "; (pacman -Qi $pkg | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1) | grep -v installed; echo ___; done | grep -v "___ ___" | sed -e 's/Optional Deps/ /' -e 's/___//' | sed -e 's/ \+/ /g'
J'ai essayé seulement dans GNU SED mais
yay -Qi | sed -n '/Optional Deps/{:l s/.* \([a-zA-Z0-9.\-]\+\):.*/\1/p; n; /Required By/!bl}'
cela a fonctionné (utilisez le tri/uniq comme vous le souhaitez).