为什么"apt-get autoremove"命令不能移除所有已安装的依赖项?

安装libav-toolsubuntu-restricted-extras还会安装以下新软件包:
  cabextract chromium-codecs-ffmpeg-extra freepats gstreamer0.10-fluendo-mp3
  gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse
  gstreamer0.10-plugins-ugly gstreamer1.0-fluendo-mp3 gstreamer1.0-libav
  gstreamer1.0-plugins-bad gstreamer1.0-plugins-bad-faad
  gstreamer1.0-plugins-bad-videoparsers gstreamer1.0-plugins-ugly
  gstreamer1.0-plugins-ugly-amr libav-tools libavcodec-extra
  libavcodec-extra-56 libavdevice55 libavfilter5 libcdaudio1 libdirac-encoder0
  libfaac0 libfftw3-double3 libflite1 libgme0 libgstreamer-plugins-bad0.10-0
  libgstreamer-plugins-bad1.0-0 libgtkglext1 libilmbase6 libmimic0
  libmjpegutils-2.1-0 libmms0 libmpeg2encpp-2.1-0 libmpg123-0 libmplex2-2.1-0
  libmspack0 libofa0 libopencore-amrnb0 libopencore-amrwb0
  libopencv-calib3d2.4 libopencv-contrib2.4 libopencv-core2.4
  libopencv-features2d2.4 libopencv-flann2.4 libopencv-highgui2.4
  libopencv-imgproc2.4 libopencv-legacy2.4 libopencv-ml2.4
  libopencv-objdetect2.4 libopencv-video2.4 libopenexr6 libsidplay1 libslv2-9
  libsoundtouch0 libspandsp2 libsrtp0 libtbb2 libvo-aacenc0 libvo-amrwbenc0
  libwildmidi-config libwildmidi1 libzbar0 oxideqt-codecs-extra

然而,apt-get autoremove libav-tools ubuntu-restricted-extras 只会移除以下内容:
  gstreamer0.10-plugins-bad-multiverse libav-tools libavcodec-extra
  libavdevice55 libavfilter5 libfaac0 ubuntu-restricted-extras

为什么autoremove不能删除所有与我最初想要安装并现在想要删除的软件包一起安装的软件包?我如何在删除这些软件包的同时自动删除它们的依赖关系?看起来我需要以某种方式跟踪每个所需软件包旁边安装的所有依赖关系,这样当我想要删除最初所需的软件包时,我可以手动删除它们。

很难回答你的问题,因为依赖关系有点复杂。有可能 apt-get autoremove libav-tools ubuntu-restricted-extras 只会删除那些 libav-toolsubuntu-restricted-extras 共同拥有的包。如果你分别对这两个包运行 apt-get autoremove 会怎样呢?或者,你可以使用 aptitude 而不是 apt-get。它会更智能地处理事务。虽然没有 autoremove 选项,但有 Remove 选项。 - user3317287
你能否也解释一下为什么apt仍然认为其他软件包是依赖关系?请修改你的问题,将aptitude why cabextract的输出以及其他软件包的输出(如果有不同的输出)都包含进去。 - gertvdijk
@user3317287,如果我分别尝试它们,情况也是一样的。 - stanny
@gertvdijk,我试了几个示例,结果显示"flashplugin-installer建议安装ttf-mscorefonts-installer"。 - stanny
1个回答

注意:sudo apt-get autoremove <package1> [<package2>, ...] = sudo apt-get remove --autoremove <package1> [<package2>, ...] 满足libav-toolsubuntu-restricted-extras的依赖关系需要将sudo apt-get install libav-tools ubuntu-restricted-extras列出的大多数软件包更新(而不是安装)到新版本。
来自Trusy的apt-get man页面
[...] 安装 [...] 如果您只想升级一个或多个已安装的软件包而不是升级系统上的每个软件包,那么这也是要使用的目标。与“升级”目标不同,“安装”将仅安装指定软件包的最新版本,而不是所有当前已安装软件包的最新版本。只需提供您希望升级的软件包的名称,如果有更高版本可用,则会下载并安装它(以及其依赖项,如上所述)。 [...]

这是合乎逻辑的,因为如果一个软件包依赖于已安装软件包的较新版本,为了运行前者,必须更新后者。

结果是,如果在安装libav-toolsubuntu-restricted-extras之前,任何已安装的软件包被其他软件包所需要,那么它们将不会被自动删除。

您可以通过在错误地期望被自动删除的每个软件包上运行apt-cache rdepends <package>来检查这一点:每个软件包都将被至少一个不会被自动删除的软件包所需要。


2但它明确表示:“将安装这些新包裹”(我上面列出的那些),而不是更新。 - stanny