查找从仓库安装的软件包

我正在尝试使用终端命令查找我从存储库安装的软件包。

我在某个地方找到了一篇帖子,说我可以使用aptitude search "?origin (<repository>) ?installed",但我无法让它正常工作。我尝试搜索来自ppa:ubuntu-wine/ppa的软件包,但是没有找到任何结果:

aptitude search "?origin (http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu/) ?installed"
aptitude search "?origin (http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu/) ?installed"
aptitude search "?origin (http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu/ raring/main) ?installed"

如果我能得到与PPA兼容的东西,那就太好了。
5个回答

这是我写的一个shell脚本,用于显示安装在不同来源上的软件包,但不包括Ubuntu。它使用了常见的dpkg -l输出格式。它比aptitude的解决方案更快速地运行。
#!/bin/sh

# Print packages installed from different origins.
# Exclude standard Ubuntu repositories.

grep -H '^Origin:' /var/lib/apt/lists/*Release | grep -v ' Ubuntu$' | sort -u \
| while read -r line; do
    origin=${line#* }    
    echo $origin:
    
    list=${line%%:*}
    sed -rn 's/^Package: (.*)$/\1/p' ${list%_*Release}*Packages | sort -u \
    | xargs -r dpkg -l 2>/dev/null | grep '^.i '
    echo
 done

一些软件包可能来自多个软件源。运行apt policy [pkgname]命令来检查当前软件包实际安装自哪个软件源。
请注意,还可能存在已安装的软件包没有可用的来源,请参考this来查找它们。

1这是唯一一个对我有效的脚本。谢谢! - cjones26
我尝试了这个脚本,但它也列出了Ubuntu的软件包。你有什么想法为什么会这样? - Random Person
@technastic_tc 你能运行以 grep 开头的命令,排除 \ 吗?将结果上传到 pastebin 并分享链接。 - jarno
@jarno https://chat.stackexchange.com/rooms/116028/room-for-technastic-tc-and-jarno - Random Person

在括号中,您应该只使用存储库的名称,而不是URI或其他内容。例如,在您的情况下:
aptitude search "?origin (ubuntu-wine) ?installed"

运行 apt-cache policy 命令以查看存储库及其名称(也称为 origin 或 o):
$ apt-cache policy | grep wine
 500 http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu xenial/main i386 Packages
     release v=16.04,o=LP-PPA-ubuntu-wine,a=xenial,n=xenial,l=Wine Team PPA,c=main,b=i386
 500 http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu xenial/main amd64 Packages
     release v=16.04,o=LP-PPA-ubuntu-wine,a=xenial,n=xenial,l=Wine Team PPA,c=main,b=amd64

由于搜索字符串是一个正则表达式模式,可以在字符串的任何位置匹配,所以您可以使用一个方便的子字符串,比如ubuntu-wine,甚至只是wine
另请参阅:如何从命令行获得所有存储库和PPA的列表并将其用于安装脚本?

这个命令对我没有列出任何软件包:aptitude search "?origin (multiverse) ?installed" - 难道不应该有吗?("multiverse" 已启用) - Volker Siegel
@VolkerSiegel 不,但是可以使用 aptitude search "?section (multiverse) ?installed" 来代替。 - jarno
1在我的系统上,这似乎列出的是已安装并且在指定仓库中可用的软件包,而不管它们是否实际上是从该仓库安装的。 - ACK_stoverflow

Origin不是存储库的URL。要找到存储库的Origin,请在以Release结尾的/var/lib/apt/lists/文件中查找。

例如

grep "Origin" /var/lib/apt/lists/linux.dropbox.com_debian_dists_wheezy_Release

将显示:

Origin: Dropbox.com

所以aptitude search "?origin(dropbox.com) ?installed"将显示我从dropbox存储库安装的软件包。

这不是我在找的东西。 - Enkouyami
如果原始名称中的某些字符在正则表达式中是特殊字符,您可能需要对其进行转义。 - jarno
https://www.debian.org/doc/manuals/aptitude/ch02s04s05.en.html#searchOrigin - jarno

从命令行来说,如果你喜欢做某事的话
awk '$1 == "Package:" { if (a[$2]++ == 0) print $2; }' /var/lib/apt/lists/*PPA-FIRST-PART*PPA-SECOND-PART*Packages

例如:所有这些都是来自Noobslab的软件包。
 jai@frank-Jai:~$ awk '$1 == "Package:" { if (a[$2]++ == 0) print $2; }' /var/lib/apt/lists/*noobslab*Packages

python-logilab-common
synapse
ubuntuone-client
python-ubuntuone-storageprotocol
ubuntuone-client-gnome
python-ubuntuone-client
lives
libweed0
libweed-dev
lives-data
converseen
minitube
libsyncdaemon-1.0-1
libsyncdaemon-1.0-dev
ubuntu-sso-client
python-ubuntuone-devtools
ubuntuone-dev-tools
ubuntuone-control-panel
python-ubuntuone-control-panel
synapse-dbg
gir1.2-syncdaemon-1.0
libweed-dbg
lives-dbg
umplayer
umplayer-translations
libgranite-dev
deepin-software-center
ubuntuone-control-panel-qt
python-dirspec
rhythmbox-ubuntuone
python-ubuntu-sso-client
ubuntu-sso-client-qt
python-ubuntu-sso-client.tests
granite-demo
ubuntuone-client-proxy
python-oauthlib
slidewall
python3-dirspec
python3-oauthlib
ubuntuone-client-data
libgranite1
libgranite1-dbg
gir1.2-granite-1.0
libgranite-common
curlew
fbmessenger
open-as-administrator
indicator-synapse
indicator-synapse-dbg
wallpaper-manager
awoken-icon-theme
malys-uniblack
malys-uniblue
malys-ex
acyl-icons
nitrux-icons
piratunbu-icons
azenis-green-icons
nouvegnome-color
nouvegnome-gray
hi-lights-icons
matrilineare
zoncolor-icons
royal-linux-icons
elementary-icons
myhumanity
myelementary
glass-icons
osx-nostalgie
sky-blue-cinnamon
sky-blue-gnome
sky-blue-unity
wine-blue-remix
lubuntubox
windows7-icons
appleart-icons
magical-lights-icons
colored-plastic-icons
numix-utouch-icon-theme
ubudao-style
artnet-icons
high-delight-icons
snow-sabre-icons
trevilla-icons
aery-icons
ambiance-blue
zukitwo
gnomishbeige-theme
salience-theme
zukiwi
gnomishgray
delorean-dark
smoothly-theme
ambiance-ds-blue
ambiance-lime
gnomishdark
zukitwo-cupertino-gs
mediterranean-theme
elementaryish
borderline
boje
wow-2
zoncolor-themes
omg-suite
simplex
leopard-steel
dorian-theme
daylight
adwaita-elements
uncomplicated
trevilla-jmhzonedark
trevilla-dark
trevilla-white
trevilla-whiteblue
trevilla-whiteorange
trevilla-white2
ambiancep-set
ambiance-crunchy
trevilla-gray
siva-series-gtk
cobibird
elegant-brit
mac-ithemes-noobslab
mac-icons-noobslab
ubuntu-touch-themes
windows8-theme
bigfootblue-cinnamon
windows8-cinnamon
eliza1-cinnamon
bigfootred-cinnamon
plus1-theme
futura
blo-theme
darkair-theme
plane-gtk3
deepin-gtk-theme
nokto-theme
numix-theme
neptune-theme
trevilla-themes
jai@frank-Jai:~$ 

信用在这里


我遇到了这个错误: bash: awk: 没有这个文件或目录 - Enkouyami
@Enkouyami /var/lib/apt/lists/的ls是什么? - Raja G
这是我得到的链接:http://pastebin.com/AmiH9E9n - Enkouyami
@Enkouyami 抱歉,我的意思是你输入的命令 - Raja G
@ rajagenupula: 使用awk命令'$1 == "Package:" { if (a[$2]++ == 0) print $2; }' /var/lib/apt/lists/<awk '$1 == "Package:" { if (a[$2]++ == 0) print $2; }' /var/lib/apt/lists/webupd8teamhaguichiPackages - Enkouyami
1@Enkouyami 好的,这不是关于命令和位置的问题。请执行以下操作:awk '$1 == "Package:" { if (a[$2]++ == 0) print $2; }' /var/lib/apt/lists/*haguichi*webupd8team*Packages - Raja G

然后您可以使用Y-PPA管理器。打开终端并键入:
sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install y-ppa-manager

然后打开您的Unity Dash并搜索Y-PPA,然后打开图标。

enter image description here

点击图中显示的 "管理 PPA",然后选择一个 PPA,它将给出该 PPA 的详细信息和其软件包。


你能提供一些使用Y-PPA管理器的说明吗? - Seth
@Seth 我的朋友,已完成。 - Raja G
我正在寻找一个命令行解决方案。 - Enkouyami
这个解决方案既不是命令行,也没有回答主要问题 - 如何列出从给定仓库安装的软件包?它只显示了来自PPA的所有可用软件包。 - Viacheslav Rodionov