如何从某个存储库中删除所有软件包?


30

为了从10.04顺利升级到10.10,我想删除默认存储库中没有的所有软件包(例如,铬PPA和第三方存储库)。查找和删除这些软件包的最简单方法(最好是CLI)是什么?

编辑:这个问题不仅限于PPA,我也有一个x2go存储库,所以我正在寻找一个通用命令来删除属于某个存储库的软件包。对于PPA,如何删除PPA有很好的答案。


对于那些想要删除所有外部软件包的用户,请禁用所有PPA并使用code.google.com/p/apt-downgrade
Lekensteyn 2012年

Answers:


12

该脚本可以列出来自特定服务器/分支的所有软件包(修改两个声明的变量):

#!/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 }'

如果您需要独立于分支机构列出不是来自特定服务器的所有软件包,则将倒数第二行替换为:

nextline == 1 { nextline = 0; if ($2 != server) print pkg }

1
不是我真正想要的东西,该脚本仅显示特定存储库条目中的所有软件包。通过替换$2 == server && $3 == branch$2 != server,我的问题得到了回答。请把它放在您的答案中:)(该branch=行可以删除)注意:假定所有软件包都来自一个存储库服务器。
Lekensteyn 2011年

1
该脚本(根据我的最后评论略作修改)按预期工作。该libvpx0软件包既存在于主要存储库中,也存在于每天的铬PPA中。从中删除存储库后/etc/apt/sources.list.d,我还有一个剩余的包:libvpx0。我对它进行了“修复”,如下所示:使用dpkg删除库,而忽略依赖项:sudo dpkg --ignore-depends=libvpx0 --remove libvpx0。接下来,从主仓库重新安装它:sudo apt-get install libvpx0
Lekensteyn

1
@Lekensteyn:sudo apt-get install libvpx0=$version_string假设两个可用的软件包具有不同的版本字符串,则可能可以缩短您的工作。
enzotib 2011年

确实,这也是可能的,甚至可能更好。
Lekensteyn 2011年

我只需要检查从默认存储库中未安装哪些软件包。该命令apt-cache policy $(dpkg -l | awk '/^ii/{print $2}') > policy.txt; awk '!/^ /{pkg=$1}check{print pkg, $2;check=0}/\*\*\*/{check=1} ' policy.txt | grep -v archive.ubuntu是一个好的开始(添加更多内容grep -v以排除某些PPA)。在任何仓库中都未知的软件包版本显示为/var/lib/dpkg/status
Lekensteyn 2014年


18

克服aptitude的Multiarch Bugppa-purge

通常,正如Vadim RutkovskyTakkat解释的那样ppa-purge使用默认语法运行是删除PPA提供的所有软件包的有效方法,并尽可能将其适当降级为其他已配置软件源提供的版本。

但是,正如Takkat所指出的那样,错误831768阻止ppa-purge删除多体系结构软件包(例如,安装在64位系统上的32位软件包)正常工作。这是因为aptitude无法处理多体系结构软件包中冲突的依赖关系(这就是错误所在),并且默认行为ppa-purgeaptitude用于降级软件包。

幸运的是,ppa-purge接受-i这会导致它喜欢的标志apt-get,以aptitude作为其后端。如错误报告中所述,using apt-get是手动调用的有效替代方法aptitude,因此ppa-purge,使用-i标志运行应该是删除/降级PPA提供的所有软件包(包括多体系结构软件包)的有效解决方法

怎么做

语法如下:

sudo ppa-purge -i ppa:ppaowner/ppaname

与往常一样(与-i不使用标志时相同):

  • ppaowner 由PPA的所有者替换。
  • /ppaname是可选的。如果存在,ppaname则替换为PPA的名称。如果不是,则默认为ppa

例如,假设我安装了用于不稳定版本的qBittorrentPPA,并且我想将其完全删除,并自动在后台使用apt-getaptitude其他软件来将qBittorrent降级为可通过我的其他软件来源获得的任何版本,而无需使用。然后我会运行:

sudo ppa-purge -i ppa:hydr0g3n/qbittorrent-unstable

记录在哪里

由于某些原因,手册页ppa-purge中未记录一些有用的选项,包括。但是您可以通过运行(或仅不带参数)获取有关它们的信息:-ippa-purge -hppa-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.

“根据喜好而取反的倾向”有点含糊。通过查看相关的源代码片段ppa-purge毕竟,这只是一个shell脚本),我们可以看到这意味着默认行为是偏向aptitudeapt-get,并且该-i标志反转了此首选项。


上一次尝试ppa-purge时,它没有删除已从PPA中删除的软件包。还是这样吗?
Lekensteyn

@Lekensteyn是的,我认为它仍然是该案件ppa-purge不会删除或不再由PPA提供降级的包被“清除”。但是,您可能要对此发布一个单独的问题,以获得更权威或有据可查的答案。
伊利亚·卡根

如果存储库不是启动板中托管的PPA,而是其他非标准存储库,则ppa-purge是否可以工作?
Anwar

1
@Anwar我不太肯定是否可行,但是您应该可以通过指定完整的存储库URL而不是来尝试ppa:username/path。另外,在尝试清除PPA之前,必须先启用PPA,即使脚本在更新要删除的软件包列表后立即禁用,它也不会“查找”已禁用的PPA。
Dragon788

1
@Lekensteyn,aptitude search ~o如果您需要清除从PPA中删除的东西(或通过一次性安装),可以尝试使用没有安装源的孤立软件包dpkg -i
Dragon788 '17

6

这是GUI的方法。希望它对那些不喜欢CLI的人有所帮助。这些步骤简单易行。

  1. 打开突触包管理器。如果未安装,请通过以下方式安装:

    sudo apt-get install synaptic
    
  2. 打开后,单击左下方的Origin按钮。它将在左上方列出所有存储库。选择要删除软件包的特定存储库。它将列出该存储库下的所有软件包。单击第一个字段,即S或“ 已安装的版本”字段,以首先显示已安装的软件包。

  3. 现在选择所有要删除的软件包。

    标记为删除的提示:

    1. 选择第一个程序包,然后按住Shift键,然后再次选择最后一个程序包以全选。然后右键单击该框,选择标记为删除标记为彻底清除

    2. 或选择任何软件包,然后按Ctrl+ A选择全部。然后右键单击方形框,然后选择要删除的标记要完全删除的标记。

而已。它将毫无问题地删除。我还附加了图像以使其更清晰。希望这会有所帮助。:)

图片


5

要至少找到它们,请先禁用PPA并运行apt-get update。然后安装apt-show-versionsapt-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,并将它们一一删除。根据发现的内容,这可能会由于依赖关系而意外卸载某些内容,因此请首先进行检查。


听起来不错,我会尝试一下。
Lekensteyn 2011年

3
升级过程本身也会自动禁用PPA,尽管我很确定它不会删除所有剩余的软件包。
Jorge Castro

@Jorge:我确实已经注意到PPA已被禁用(注释掉),但是它并没有删除软件包。我认为最好先删除软件包,然后再从Ubuntu存储库中覆盖新版本的文件。
Lekensteyn 2011年

我刚刚进行了测试,并且没有区分主存储库和PPA的程序包。在我的情况下,它是libvpx0每天使用铬的PPA 的包装。@enzotib的答案确实显示了此软件包。
Lekensteyn 2011年

如果您apt-show-versions以非root用户身份运行,则需要a sudo apt-show-versions -i来更新其缓存并查看新删除的存储库/ PPA中的更改(否则,只能通过cron.daily作业进行更新)
Xen2050

0

我发现使用ppa-purge很困难。

打开系统下的Synaptic软件包管理器,然后选择设置,存储库。

删除不需要的内容。

做完了!


4
这只会删除软件包源,而不会从那些源中删除软件包。
Lekensteyn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.