问题描述
为了从10.04平滑升级到10.10,我想删除所有不在默认存储库中的包(例如, chrome PPA和third-party存储库)。查找和删除这些包的最简单方法(最好是CLI)是什么?
编辑:这个问题不仅限于PPA,我也有一个x2go存储库,所以我正在寻找一个通用命令来删除属于某个存储库的包。对于PPA,问题How can PPAs be removed有很好的答案。
最佳解决办法
此脚本可以列出特定服务器/分支的所有包(修改两个声明的变量):
#!/bin/bash
server="http://it.archive.ubuntu.com/ubuntu/"
branch="maverick-updates/main"
apt-cache policy $(dpkg -l | awk 'NR >= 6 { print $2 }') |
awk -v server="$server" -v branch="$branch" \
'/^[^ ]/ { split($1, a, ":"); pkg = a[1] }
nextline == 1 { nextline = 0; if ($2 == server && $3 == branch) print pkg }
/\*\*\*/ { nextline = 1 }'
如果您需要独立于分支列出所有非特定服务器的软件包,请将next-to-last行替换为:
nextline == 1 { nextline = 0; if ($2 != server) print pkg }
次佳解决办法
看看ppa-purge。
用法:
ppa-purge -purge <nameofppa> [-s hostserver]
Hostserver默认为ppa.launchpad.net
。
以下是ppa-purge
命令联机帮助页的链接以供参考。
第三种解决办法
克服aptitude
的ppa-purge
多重Bug
通常,由于Vadim Rutkovsky和Takkat具有explained,因此使用默认语法运行ppa-purge
是删除PPA提供的所有程序包的有效方法,只要有可能,请将其正确降级到其他已配置软件源中提供的版本。
但是,正如Takkat指出的那样,bug 831768可以防止ppa-purge
正常工作以删除multiarch软件包(例如安装在64位系统上的32位软件包)。这是因为aptitude
无法处理多域程序包中的冲突依赖项(这就是bug的内容),而ppa-purge
的默认行为是使用aptitude
来降级程序包。
幸运的是,ppa-purge
接受-i
标志,这使得它更喜欢apt-get
和aptitude
作为其后端。如错误报告中所述,使用apt-get
是手动调用aptitude
的有效替代方法,因此使用-i
标志运行ppa-purge
应该是一种有效的解决方法,用于删除/降级PPA提供的所有包,包括multiarch包。
怎么做
这是语法:
sudo ppa-purge -i ppa:ppaowner/ppaname
像往常一样(与不使用-i标志时相同):
-
ppaowner
由PPA的所有者替换。 -
/ppaname
是可选的。如果存在,ppaname
将替换为PPA的名称。如果没有,则默认为ppa
。
例如,假设我安装了PPA for unstable builds of qBittorrent,并且我想完全删除它,自动将qBittorrent降级为使用apt-get
在幕后而不是aptitude
通过我的其他软件源提供的任何版本。然后我会跑:
sudo ppa-purge -i ppa:hydr0g3n/qbittorrent-unstable
它被记录在哪里
出于某种原因,its manual page中没有记录ppa-purge
的一些有用选项,包括-i
。但是你可以通过运行ppa-purge -h
(或者只是没有参数的ppa-purge
)来获取有关它们的信息:
ek@Del:~$ ppa-purge -h
Usage: sudo ppa-purge [options] <ppa:ppaowner>[/ppaname]
ppa-purge will reset all packages from a PPA to the standard
versions released for your distribution.
Options:
-p [ppaname] PPA name to be disabled (default: ppa)
-s [host] Repository server (default: ppa.launchpad.net)
-d [distribution] Override the default distribution choice.
-y Pass -y --force-yes to apt-get or -y to aptitude
-i Reverse preference of apt-get upon aptitude.
-h Display this help text
Example usage commands:
sudo ppa-purge xorg-edgers
will remove https://launchpad.net/~xorg-edgers/+archive/ppa
sudo ppa-purge -p xorg-testing sarvatt
will remove https://launchpad.net/~sarvatt/+archive/xorg-testing
sudo ppa-purge ppa:ubuntu-x-swat/x-updates
will remove https://launchpad.net/~ubuntu-x-swat/+archive/x-updates
Notice: If ppa-purge fails for some reason and you wish to try again,
(For example: you left synaptic open while attempting to run it) simply
uncomment the PPA from your sources, run apt-get update and try again.
“apt-get对能力的反向偏好”有点神秘。通过查看the relevant piece of the source code(毕竟ppa-purge
只是一个shell脚本),我们可以看到这意味着默认行为是更喜欢aptitude
到apt-get
,而-i
标志会反转此首选项。
第四种办法
这是GUI方法。希望对那些不喜欢CLI的人有所帮助。步骤简单易懂。
-
打开synaptic package manager。如果没有安装,请按以下方式安装:
sudo apt-get install synaptic
-
打开时,单击down-left上的Origin按钮。它将列出top-left端的所有存储库。选择要删除其包的特定存储库。它将列出该存储库下的所有包。单击第一个字段i,e S或Installed Version字段以首先显示已安装的软件包。
-
现在选择要删除的所有包。标记删除的提示:
-
选择第一个包然后按住
Shift
键并再次选择最后一个包以选择全部。然后右键单击方框并选择要删除的标记或标记为完全删除。 -
或选择任何包,然后按
Ctrl
+A
选择全部。然后右键单击方框并选择标记进行删除或标记为完全删除。
-
而已。它将删除没有任何问题。我还附上图片以使其更清晰。希望它会有所帮助。 🙂
第五种办法
要至少找到它们,首先禁用PPA并运行apt-get update
。然后安装apt-show-versions
。然后,运行apt-show-versions | grep 'No available'
将为您提供在配置的存储库中找不到的所有已安装软件包的列表。使用一些命令行魔法你可能只能剥离包名并将它们传递给apt-get remove
:
for i in `apt-show-versions | grep 'No available' | cut -d' ' -f 1` ; do sudo apt-get remove -y $i ; done
请注意,这将通过从apt-show-versions
返回的列表并逐个删除它们。根据它找到的内容,这可能会因为依赖性而卸载意外的内容,因此请先检查它。