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직접 사용하지 않습니다.

몇 가지 제한 사항이 있습니다. 특히 어떤 항목인지 확인하지 않습니다.버전현재 설치된 v.는 저장소에서 사용할 수 있으며 데비안은 패키지가 실제로 설치된 저장소를 확인할 수 있는 방법을 제공하지 않습니다.

답변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도구를 사용하여 이 데이터에 액세스하는 것이 더 좋습니다 .

관련 정보