"dpkg -l"과 유사하지만 패키지 원본/소스를 포함하는 Debian의 패키지 나열

"dpkg -l"과 유사하지만 패키지 원본/소스를 포함하는 Debian의 패키지 나열

이 테이블의 모든 패키지를 나열하고 싶습니다.

$ dpkg -l libav\*

하지만 이 출력 외에도 각 패키지의 원본/소스(선호하는 용어는 확실하지 않음)도 원합니다. 패키지가 어떤 소스에도 해당하지 않으면 알 수 없음 또는 이와 유사한 것으로 표시되어야 합니다. 내 생각에 가장 유망한 접근 방식은 다음을 사용하는 것입니다.dctrl 도구, 하지만 어떻게 해야 할지 모르겠습니다. 배경으로 ffmpeg와 일치하지 않는 라이브러리를 디버깅하려고 합니다. 바라보다데비안 버그 보고서 - ffmpeg: 불안정한 버전에서 4:0.6.1-5를 백포트하면 경고가 발생합니다: 라이브러리 구성 불일치. 오류 보고는 더 이상 문제가 되지 않지만 여전히 문제에 관심이 있습니다.

형식을 지우려면 다음과 같아야 합니다.

ii  libavahi-client-dev  0.6.27-2+squeeze1  Development files for the Avahi client library  squeeze
ii  libavcodec-dev       4:0.6.1-5          Development files for libavcodec                unstable

동일한 패키지가 여러 카테고리에서 사용 가능한 경우. 짜내고 테스트하는 동안가장 낮은/가장 오래된사용 가능한 카테고리를 사용해야 합니다. 이 경우 짜내십시오.

답변1

Dpkg는 이 정보를 추적하지 않습니다. 각 파일의 출처는 .deb중요하지 않습니다.

Apt는 이 정보도 추적하지 않지만 지금 패키지를 어디서 얻을 수 있는지 알고 있습니다. 이것으로 충분합니다.

~처럼9000주석으로 작성하여 apt-cache policy '^libav'이름이 정규식과 일치하는 패키지 버전이 ^libav설치되었거나 사용 가능한지 표시합니다. 출력은 구문 분석하기가 특히 편리하지는 않지만 원하는 형식을 대략적으로 제공하는 최소한의 테스트를 거친 스크립트는 다음과 같습니다.

{ LC_CTYPE=C apt-cache policy '^libav'; echo .; } | perl -l -ne '
    if (!/^ /) {
        if (defined $version) {print "$package: $version unknown"}
        s/: *$//; $package=$_; $installed=1; $version=undef;
    }
    if (/^ *Installed: *\(none\)$/) {$installed=0}
    if ($installed && /^ \*+ +([^ ]+)/) {$version=$1}
    if (/^     [^ ]/) {$version=undef}
    if ($installed && defined $version && /^ +[0-9]+ +[^ ]+ +([^ \/]+)/) {
        print "$package: $version $1";
        $version=undef;
    }
'

요청한 정보를 얻는 또 다른 방법은 를 사용하는 것입니다 aptitude versions. 다시 말하지만, 아래의 최소한으로 테스트된 코드 조각은 대략적으로 원하는 형식을 제공합니다. 패턴은 "^libav" ~i이름이 지정된 정규식과 일치하는 설치된 패키지와 일치합니다.

aptitude versions '"^libav" ~i' |
awk -vRS= '{if ($6 !~ /[^0-9]/) {$6="unknown"}
            print $3, $2, $5, $6}'

별도로 패키지된 유틸리티도 있습니다.apt-show-versions다시 말하지만, 대략적으로 요청한 형식으로 원하는 정보를 제공합니다.

apt-show-versions | grep '^libav'

관련 정보