AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 5976
Accepted
Marius Gedminas
Marius Gedminas
Asked: 2010-10-12 05:15:53 +0800 CST2010-10-12 05:15:53 +0800 CST 2010-10-12 05:15:53 +0800 CST

如何列出我从特定存储库安装的所有软件包?

  • 772

如何列出我从特定存储库安装的所有软件包?

如何列出主 Ubuntu 档案中不可用的所有已安装软件包,并查看它们来自哪些存储库?(如果我知道这个问题的答案,我可以在该列表中查找特定的 PPA 名称来找出我的第一个问题的答案。)

package-management apt
  • 7 7 个回答
  • 21512 Views

7 个回答

  • Voted
  1. Riccardo Murri
    2010-10-12T10:41:07+08:002010-10-12T10:41:07+08:00

    似乎没有关于已安装包的来源的记录。

    如果您可以从下载同名包的位置获取位置,则可以通过 apt-cache policy. 以下(相当丑陋的)脚本对我有用:

    LC_ALL=C dpkg-query --showformat='${Package}:${Status}\n' -W '*' \
      | fgrep ':install ok installed' \
      | cut -d: -f1 \
      | (while read pkg; do 
           inst_version=$(apt-cache policy $pkg \
                                    | fgrep Installed: \
                                    | awk '{ print $2 }'); 
           origin=$(apt-cache policy "$pkg" \
                              | fgrep " *** ${inst_version}" -C1 \
                              | tail -n 1 \
                              | cut -c12-); 
           echo $pkg $origin; 
         done)
    

    请注意,它非常脆弱,因为它对 的输出做出假设apt-cache policy,这可能会因版本而异......

    • 30
  2. lovinglinux
    2010-10-12T05:23:20+08:002010-10-12T05:23:20+08:00

    打开 Synaptic Package Manager 并单击左侧边栏底部的“Origin”按钮。它将列出您的来源。选择一个来源以查看可用/已安装的软件包。

    • 24
  3. Best Answer
    andrewsomething
    2010-10-12T07:05:15+08:002010-10-12T07:05:15+08:00

    展开 Ubuntu 软件中心中的“已安装软件”项。您将看到已启用的所有不同存储库的列表。单击 repo 将显示您从每个安装的包。

    替代文字

    • 23
  4. jarno
    2016-01-10T14:33:17+08:002016-01-10T14:33:17+08:00

    此脚本列出了 PPA 中已安装和可用的软件包:

    #!/bin/sh
    # Give PPA name as an argument, e.g. ppa:oibaf/graphics-drivers
    
    name1="$(echo "$1"|cut -d: -f2|cut -d/ -f1)"
    name2="$(echo "$1"|cut -d/ -f2)"
    
    awk '$1 == "Package:" { if (a[$2]++ == 0) print $2; }' \
    /var/lib/apt/lists/*"$name1"*"$name2"*Packages |
    xargs dpkg-query -W -f='${Status} ${Package}\n' 2>/dev/null  | awk '/^[^ ]+ ok installed/{print $4}'
    

    我应用了这个。

    顺便说一句,至于从使用中删除 PPA,请使用 ppa-purge 程序;我在这里创建了它的改进版本。

    • 4
  5. Graham Dunn
    2013-03-13T05:16:29+08:002013-03-13T05:16:29+08:00

    在 Quantal (12.10) 下,需要去除原点行中的空格。

    LC_ALL=C dpkg-query --showformat='${Package}:${Status}\n' -W '*' \
     | fgrep ':install ok installed' \
     | cut -d: -f1 \
     | (while read pkg; do 
       inst_version=$(apt-cache policy $pkg \
                                | fgrep Installed: \
                                | cut -d: -f2-); 
       origin=$(apt-cache policy "$pkg" \
                          | fgrep " ***${inst_version}" -C1 \
                          | tail -n 1 \
                          | cut -c12-); 
       echo $pkg $origin; 
     done)
    
    • 3
  6. Patrick Häcker
    2021-04-13T22:02:23+08:002021-04-13T22:02:23+08:00

    如果你的系统没有Wayland/X服务器(比如树莓派),andrewsomething和lovelinux的答案就不能用了。jarno的回答将用例仅限于 PPA,尽管这个问题是普遍感兴趣的。来自Riccardo Murri和Graham Dunn的脚本由于重复apt-cache policy调用(例如大约 10 分钟的运行时间)而非常缓慢。

    所以这是我的电话解决外壳上的一般情况要快得多(比如运行时间不到 10 秒)

    apt list --installed 2> /dev/null \
      | cut -d/ -f1 \
      | parallel -n200 apt-cache policy \
      | rg '^(\S+)[\s\S]+?\* (?:\S+\s+){3}(\S+)' -Uor '$1 $2'
    

    apt list --installed获取所有已安装软件包的列表,忽略 apt 关于未来可能的格式更改的消息,2> /dev/null并仅提取软件包名称,cut使用/作为分隔符-d/并返回第一个字段-f1。

    然后,apt-cache policy用于获取有关所有包的更多信息。这可以用 xargs 执行,正如apt-cache预期的那样,它的输入是命令行参数。由于这是剩余的性能关键部分,因此使用parallel包parallel中的 GNU 来并行运行多个apt-cache进程,查找 200 个包,每个包使用-n200. 请注意,xargs 也可以并行运行多个命令,但会在换行符上同步输出,这通常在这里是不正确的。

    最后,apt-cache的输出使用rgfrom 包解析,ripgrep这是一个非常快速且支持多行的grep后继程序,-U允许输出两个正则表达式捕获组-or '$1 $2'。正则表达式用 捕获包名^(\S+),跳到用 标记已安装存储库的最后一个星[\s\S]+?\* 号,然后用 跳过三个单词,(?:\S+\s+){3}最后用 捕获存储库(\S+)。

    • 2
  7. Aaron Whitehouse
    2021-07-31T11:27:01+08:002021-07-31T11:27:01+08:00

    像这个 Python 脚本这样的东西应该会找到您机器上安装的所有非 Ubuntu 软件包:

    #!/usr/bin/env python3
    #
    # This lists all packages not from Ubuntu's (e.g. main/universe) repositories
    # To use, simply download/copy into a .py file and run with:
    # python3 list_non_ubuntu.py
    #
    # If you receive an import error, you may need to install python3-apt first with e.g.
    # sudo apt install python3-apt
    # but this is often not necessary
    
    import apt
    
    
    cache = apt.Cache()
    package_count = 0
    
    for package in cache:
        if (
            package.is_installed
            and package.candidate.origins[0].origin != "Ubuntu"
        ):
            package_origin = package.candidate.origins[0]
            print(
                package.name,
                # See https://apt-team.pages.debian.net/python-apt/library/apt.package.html#apt.package.Origin
                # for further details on the meanings of the below
                package_origin.origin,  # The Origin, as set in the Release file
                package_origin.archive,  # The archive (eg. Ubuntu release name)
                package_origin.component,  # The component (eg. main/universe)
                package_origin.site,  # The hostname of the site.
                # package_origin.label,  # The Label, as set in the Release file
                # package_origin.trusted,  # Origin trusted (Release file signed by key in apt keyring)
            )
            package_count += 1
    
    print(package_count, "packages not from Ubuntu")
    

    在我的机器上,这需要不到 5 秒的时间来运行,而当前的最佳答案(来自 Riccardo/Pablo)则需要超过 8 分钟。输出格式为:

    $ python3 list_non_ubuntu.py 
    azure-cli azure-cli focal focal main packages.microsoft.com
    google-chrome-stable Google LLC stable main dl.google.com
    [...]
    signal-desktop . xenial xenial main updates.signal.org
    8 packages not from Ubuntu
    

    如果您只想要来自特定 ppa 的内容,则可以and package.candidate.origins[0].site == "[ppa-domain.com]"在之后添加一个附加内容。.origin != "Ubuntu"

    • 2

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行判断机器是否需要重新启动?

  • 有没有办法重置所有包/源并从头开始?

  • 如何回滚到 PHP 5.2?

  • 包管理器之间有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何安装 .run 文件?

    • 7 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    如何获得 CPU 温度?

    • 21 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Marko Smith

    你如何重新启动Apache?

    • 13 个回答
  • Marko Smith

    如何卸载软件?

    • 11 个回答
  • Marko Smith

    如何删除 PPA?

    • 26 个回答
  • Martin Hope
    NES 如何启用或禁用服务? 2010-12-30 13:03:32 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    Olivier Lalonde 如何在结束 ssh 会话后保持进程运行? 2010-10-22 04:09:13 +0800 CST
  • Martin Hope
    David B 如何使用命令行将用户添加为新的 sudoer? 2010-10-16 04:02:45 +0800 CST
  • Martin Hope
    Hans 如何删除旧内核版本以清理启动菜单? 2010-08-21 19:37:01 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve