在 Debian 中列出软件包,a la `dpkg -l`,但包括软件包 origin/source

Fah*_*tha 5 debian dpkg apt

我想列出表单的所有包

$ dpkg -l libav\*
Run Code Online (Sandbox Code Playgroud)

但除了这个输出之外,我想要每个包的来源/来源(我不确定首选术语)。如果包裹不符合任何来源,则应显示未知或类似。在我的脑海中,最有前途的方法是使用dctrl-tools,但我不确定如何去做。作为背景,我试图用 ffmpeg 调试库不匹配。请参阅Debian 错误报告 - ffmpeg: backport of 4:0.6.1-5 from unstable 产生 WARNING: library configuration mismatch。错误报告不再是问题,但我仍然对这个问题感兴趣。

只是为了清楚格式,这应该看起来像

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
Run Code Online (Sandbox Code Playgroud)

如果同一个包在多个类别中可用,即。在挤压和测试中,应使用可用的最低/最旧类别。在这种情况下,挤压。

Gil*_*il' 5

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;
    }
'
Run Code Online (Sandbox Code Playgroud)

获取您要求的信息的另一种方法是使用aptitude versions. 同样,下面经过最少测试的代码段大致提供了所需的格式。该模式"^libav" ~i匹配已安装且名称与给定正则表达式匹配的包。

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

还有一个单独的包实用程序apt-show-versions,它再次以您要求的大致格式提供您想要的信息。

apt-show-versions | grep '^libav'
Run Code Online (Sandbox Code Playgroud)