Listen Sie optionale Abhängigkeiten mit Pacman unter Arch Linux auf

23

Ich benutze Arch Linux.

Gibt es eine Möglichkeit, optionale Abhängigkeiten aller installierten Pakete aufzulisten? Und wenn ja, kann ich diese Liste filtern, um nur die fehlenden (nicht installierten) Pakete anzuzeigen?

vonPetrushev
quelle
1
Ich habe Arch nicht benutzt, aber "Dependency" klingt nicht optional (es ist nicht in anderen Distributionen).
Jordanien
AFAIK, ich glaube nicht, dass du das sofort mit Pacman machen kannst. Es ist jedoch sehr gut möglich, ein kleines Skript dafür zu schreiben. Fragen Sie pacman nach einer Liste der installierten Pakete. Lassen Sie Yaourt ihre PKGBUILDs holen und die Liste der Optdeps lesen. Die neueste Version von pacman-git hat ein Commit, das angibt, ob die Optdeps bereits installiert wurden.
Darnir
@jordanm: As hat Build-Abhängigkeiten und optionale Abhängigkeiten. Optdeps sind nur für bestimmte Funktionen eines Pakets erforderlich. Wenn Sie diese Funktion nicht verwenden, müssen Sie Ihr System nicht wirklich mit einer Menge Abhängigkeiten überladen.
Darnir
Ich benutztepacman -Qi | grep "Optional Deps" | grep -v None | grep -v installed
StewSquared

Antworten:

5

Sie können expac verwenden , um die pacmanDatenbank abzufragen .

So etwas wie:

awk 'NF>=2' <(expac "%n %O") > optdeps

druckt eine Liste aller auf Ihrem Rechner installierten Pakete und die optdependsfür jedes einzelne ( %O) 1 aufgerufene Datei aus optdeps. Sie können dies dann anhand einer Liste installierter optdepends-Pakete sortieren.

Siehe man expacdie vollständige Liste der Optionen.


1. Das ist ein Großbuchstabe O, keine Null. Weil wir keine Schrift haben können, die zwischen den beiden unterscheidet ...

jasonwryan
quelle
[stupsen] Wir haben jetzt eine solche Schriftart. :)
muru
4

Es gibt ein nettes Dienstprogramm im AUR-Repository (aur / pacdep).

pacdep hat viele Möglichkeiten - nur ein Beispiel - finde optionale Pakete für "thunar-archive-plugin" heraus:

> 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
[...]

Die Ausgabe oben bedeutet, dass keines der optionalen Pakete installiert ist. Nach der Installation von "xarchiver" sieht die Ausgabe so aus

[...]
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
[...]

Ich habe (den ersten Teil) dieser Antwort auf
http://mywaytoarch.tumblr.com/post/34979742718/easily-list-package-dependencies gefunden

Martin Schneeweis
quelle
3

Dies ist nicht gerade effizient, wird aber das finden, was Sie wollen (in FARBE!):

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 
Dunkles Herz
quelle
Ich bin mir nicht ganz sicher, aber soll nicht so sein , ||statt &&nach dem grep, und dann Klammern um den Rest der Zeile?
Rörd
Und was noch wichtiger ist, sollte dies wahrscheinlich den Abschnitt "Optional Deps" anstelle des Abschnitts "Depends On" der Pacman-Ausgabe verwenden.
Rörd
Zum Beispiel mit xmms2 :pacman -Qi xmms2 | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1 | cut -c19- | cut -d: -f1
i336_
2

Obwohl ich feststellen musste, dass @ DarkHearts Lösung nicht wirklich funktioniert, hat es mich dazu inspiriert, eine funktionierende Lösung zu entwickeln. (allerdings keine Farben)

Ich verwende package-query , ein ähnliches Tool anstelle von expac, das von @jasonwryan vorgeschlagen wurde, weil ich es bereits installiert habe (es ist eine Abhängigkeit von yaourt). Es sollte trivial sein, dies zu ändern, um stattdessen expac zu verwenden.

Die Auflistung aller optionalen Abhängigkeiten erfolgt meist durch den Aufruf der Paketabfrage. Die erste for-Schleife entfernt die Erklärungen, sodass nur die Paketnamen für die optionalen Abhängigkeiten übrig bleiben. Die zweite for-Schleife entfernt die bereits installierten Abhängigkeiten in der ersten Zeile, bevor die Ergebnisse in der zweiten Zeile ausgegeben werden.

#!/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;
}
Rörd
quelle
2

Dies sollte den Trick machen:

comm -23 <(expac -l"\n" "%o" | sort -u) <(expac -l"\n" "%n\n%S" | sort -u)

Erste Eingabe, um commalle optionalen Abhängigkeiten aufzulisten, zweite Eingabe, um alle installierten Pakete und ihre Attribute für die Bereitstellung aufzulisten. Beide Listen sind sortiert und enthalten jedes Element nur einmal aufgrund von sort -u. Es werden dann nur Zeilen angezeigt, die in der ersten, aber nicht in der zweiten Liste enthalten sind.

(bearbeitet, um @ Archemars Vorschlag aufzunehmen)

Sonntag
quelle
0

Manchmal muss man rückwärts arbeiten ... erst alle nicht optionalen Abhängigkeiten finden, dann Querverweis mit vollständiger Liste, dann uniq verwenden. Dadurch wird eine Liste der installierten optionalen Abhängigkeiten generiert.

Finde alle installiert

pacman -Q

Finde alle nicht optionalen:

pacman -Qent

Eindeutige Einträge müssen daher optional sein:

(pacman -Q; pacman -Qent) | sort | uniq -u 

Liste der fehlenden optionalen abhängig mit Beschreibungen generieren, nicht hübsch, aber es funktioniert.

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'
kevinf
quelle
0

Ich habe es aber nur in GNU sed versucht

yay -Qi | sed -n '/Optional Deps/{:l s/.* \([a-zA-Z0-9.\-]\+\):.*/\1/p; n; /Required By/!bl}'

das hat funktioniert (benutze sort / uniq wie du willst).

Yuki Ito
quelle