web-dev-qa-db-ja.com

Arch Linuxでpacmanを使用してオプションの依存関係を一覧表示する

Arch Linuxを使用しています。

インストールされているすべてのパッケージのオプションの依存関係を一覧表示する方法はありますか?はいの場合、このリストをフィルタリングして、不足している(インストールされていない)パッケージのみを表示できますか?

23
vonPetrushev

expac を使用して、pacmandatabaseを照会できます。

何かのようなもの:

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

マシンにインストールされているすべてのパッケージのリストと、各パッケージのoptdepends%O)を出力します1optdepsというファイルに。次に、インストールされたoptdependsパッケージのリストに対してこれをソートできます。

オプションの完全なリストについては、man expacを参照してください。


1.それは大文字のOであり、ゼロではありません。 2つのフォントを区別することはできません ...

5
jasonwryan

AURリポジトリ(aur/pacdep)には素敵なユーティリティがあります。

pacdepには多くのオプションがあります-ほんの一例-「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
[...]

上記の出力は、オプションパッケージがインストールされていないことを意味します。 「xarchiver」をインストールすると、出力は次のようになります。

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

私はこの答え(の最初の部分)を見つけました
http://mywaytoarch.tumblr.com/post/34979742718/easily-list-package-dependencies

4

これは正確には効率的ではありませんが、(COLORで)必要なものが見つかります:

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 
3
DarkHeart

これでうまくいくはずです:

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

commへの最初の入力はすべてのオプションの依存関係をリストし、2番目の入力はすべてのインストール済みパッケージとその「提供」属性を入力します。両方のリストは並べ替えられ、sort -uにより各要素が1回だけ含まれます。次に、最初のリストには含まれているが2番目のリストには含まれていない行のみが表示されます。

(@Archemarの提案を組み込むように編集)

2
Sunday

@DarkHeartのソリューションは実際には機能しないことに気づかなければなりませんでしたが、それが機能するソリューションを作成するように促しました。 (ただし、色なし)

私はそれをすでにインストールしているため(yaourtの依存関係です)、@ jasonwryanによって提案されたexpacの代わりに同様のツール package-query を使用しています。代わりにexpacを使用するようにこれを変更するのは簡単です。

すべてのオプションの依存関係のリストは、主にpackage-queryの呼び出しによって行われます。最初のforループは説明を削除するため、オプションの依存関係のパッケージ名だけが残ります。 2番目のforループは、最初の行に既にインストールされている依存関係を削除してから、2番目のforループに結果を出力します。

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

時には逆方向に作業する必要があります...最初にオプションではない依存関係をすべて見つけ、次に完全なリストと相互参照し、次にuniqを使用します。これにより、インストールされているオプション依存のリストが生成されます。

インストールされているすべてを検索

pacman -Q

オプション以外のすべてを検索:

pacman -Qent

したがって、一意のエントリはオプションである必要があります。

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

欠落しているオプションのリストを生成することは、かなりきれいではなく説明に依存しますが、機能します。

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

GNU sedでのみ試しましたが、

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

これはうまくいきました(好きなようにsort/uniqを使用してください)。

0
Yuki Ito