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 |非フリー|制限付き|マルチバース|パートナー)」のようなものを探しているので、すべてのパッケージにこのセクションがあるわけではないため、どちらも役に立ちませんでした。
さて、標準ユーティリティでこれを行うための解決策は見つかりませんでしたが、 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
を使用する代わりにパッケージ全体の検索を開始します。