apt:特定のソースからインストールされたパッケージクエリ

apt:特定のソースからインストールされたパッケージクエリ

会社のプライベートaptリポジトリからインストールされているパッケージのリストを取得しようとしています。

これは働きます:

#!/bin/bash
fqdn=$1

for pkg in $(dpkg-query --show | awk '{print $1;}'); do
  if apt-cache showpkg $pkg | grep -q $fqdn; then
    echo $pkg
  fi
done

ただし、〜3466()パッケージがインストールされているシステムでそれを実行するにはdpkg -l | wc -l1分45.812秒かかります。 「インストールされたパッケージをローカルで検索」がユーザーに表示されるのに時間がかかりすぎます。

もっと良い方法がありますか?


私は交互に行を読み取ろapt-cache showpkgうとします。これはCLIインターフェイスが不安定で15分35.913秒かかるという警告です。apt showAPT-Sources:

答え1

パッケージを繰り返さないでください。

dpkg -l | awk '/^ii/ { print $2 }' | xargs apt-cache showpkg |
awk "/^Package:/ { package = \$2 } /$1/ { print package }" | uniq

私のシステムはこれに数秒かかり、6,000を超えるパッケージをインストールして/var/lib/apt直接使用しません。

いくつかの制限があります。特にどんなアイテムなのか確認しません。バージョン現在インストールされているバージョンはリポジトリで使用でき、Debianはパッケージが実際にインストールされているリポジトリを確認する方法を提供しません。

答え2

これは必要です0m3.654sが、使用されます/var/lib/apt

#!/bin/bash
fqdn=$1
for pkg in $(dpkg-query --show | awk -F "[ \t:]" '{print $1;}'); do
  if grep -q "Package: $pkg" /var/lib/apt/lists/${fqdn}_*_Packages; then
    echo $pkg
  fi
done

私はこれが/var/lib/apt内部的であることを知っaptているのでapt、実装を変更してスクリプトを中断するオプションがあります。このようなことが起こる可能性は低いですが、起こることがあります。代わりに、一般的にaptツールを使用してこのデータにアクセスすることをお勧めします。

関連情報