web-dev-qa-db-ja.com

特定のカテゴリ(コンポーネント)からインストールされたすべてのパッケージをリストする方法

Apt、apt-cache、aptitudeなどのユーティリティを使用して、特定の公式リポジトリコンポーネント(メイン、制限、ユニバース、またはマルチバース)からインストールされたすべてのパッケージを一覧表示することは可能ですか?

この目的のために簡単なスクリプトを書きました。

dpkg -l | grep ^ii | cut -f3 -d ' ' | while read -r pkg;
do
 status=`apt-cache show $pkg | grep -m1 "Section: multiverse"`
 if [ ! -z "$status" ] 
 then
  echo $pkg
 fi
done;

それは機能しますが、すべてのパッケージを1つずつチェックするため、本当に遅いです。このスクリプトに対してtimeコマンドを実行すると、以下が生成されます。

real    1m16.797s
user    0m57.008s
sys     0m8.260s

すでに aptitude検索パターン 、および dpkg-query のフォーマットを試しましたが、この目的のためのクエリを作成するための適切なカラム/スキーマがないようです。

vrms スクリプトを見て、どのように機能するかを調べました。contrib/ non-freeパッケージを見つけるのは非常に高速であるため、vrmsスクリプトは/var/lib/dpkg/statusファイル全体をスキャンするようです。 「セクション:(contrib |非フリー|制限付き|マルチバース|パートナー)」のようなものを探しているので、すべてのパッケージにこのセクションがあるわけではないため、どちらも役に立ちませんでした。

3
Ravexina

さて、標準ユーティリティでこれを行うための解決策は見つかりませんでしたが、 vrms を見てから、インストールされたパッケージを検索するためのかなり良いスクリプトを思い付きました特定のコンポーネント。

私の質問で言及した他のスクリプトは、本当に時間がかかりました。
ただし、新しいスクリプトは次の場所から入手できます: pkgs-from.sh

使用法は次のとおりです。

./pkgs-from.sh universe # or main, multiverse, backports

そして、これに対するtimeコマンドの結果は次のとおりです。

real    0m4.367s
user    0m0.980s
sys     0m0.408s

それはかなり良いです。

どのように機能しますか?
スクリプトは、/var/lib/apt/lists/ディレクトリ内の関連ファイルから、要求されたコンポーネントに関連するすべてのパッケージのリストを作成し、apt-cacheを使用する代わりにパッケージ全体の検索を開始します。

1
Ravexina