使用apt-get命令来删除软件包及其依赖项。

我最近一直在阅读关于删除软件包和依赖项的许多问题/答案/意见。有很多不同的方法可以做到这一点,有些过于复杂,有些则不够完整。我想在这里问问其他人认为最好的方法是如何清理软件包以及包括配置文件、依赖项和依赖项的配置文件在内的所有内容。我也会提供我的方法,这是通过大量试错和抓狂得出的。
4个回答

警告:这可能会删除您仍然需要的软件包。如果发生这种情况,只需重新安装它们即可。但是老实说,当您安装/卸载会对系统进行重大更改的东西时...为什么不先备份呢。
我想到的最彻底的方法是完全删除一个软件包及其依赖项以及所有配置文件,包括依赖项的配置文件,并进行一些清理工作。在这个过程中,PACKAGENAME是要删除的主要软件包。
  • 从桌面注销并按下Ctrl+Alt+F1,然后登录到TTY1并运行以下命令:

    sudo apt-get purge <PACKAGENAME>
    sudo apt-get purge $(apt-cache depends <PACKAGENAME> | awk '{ print $2 }' | tr '\n' ' ')
    sudo apt-get autoremove
    sudo apt-get update
    sudo apt-get check
    sudo apt-get -f install
    sudo apt-get autoclean
    
  • 如果需要的话,重新启动

    sudo shutdown -r now
    
第二行发生了什么?管道从apt-cache depends命令的输出中提取并重新格式化数据。第一个管道awk '{ print $2 }'将apt-cache depends命令的输出结果中的第二列打印出来。如果没有这个管道,列表中还会有另一列,即依赖类型,例如"depends"、"recommends"等。然后,第二个管道tr '\n' ' '将该结果中的换行符删除,并用空格替换它们,以分隔名称。所有这些操作都返回一个以空格分隔的PACKAGENAME的所有依赖包名称的列表,这样可以方便地与多个包输入一起使用purge命令选项。
这对于元包特别有效。我在最后运行了"sudo apt-get -f install"命令,以检查可能的损坏包并在一次性进行了如此多的更改后修复它们。每当我添加一个"DE"并想要返回时,我都会特别这样做。最近,在安装GNOME后,我使用了这个方法,它甚至修复了即使在使用autoremove之后仍然保留了我的GRUB更改和登录选项的问题。当我尝试使用lubuntu-desktop时,它解决了一些冲突,并删除了由purge和autoremove留下的DM登录条目。
另一种类似的方法也很有效,可能更安全,但并不总是能够完全解决所有问题。
sudo apt-get --purge autoremove PACKAGENAME

可能需要跟进的内容:
sudo apt-get update
sudo apt-get check
sudo apt-get -f install
sudo apt-get autoclean

看起来这是一个很好的方法,我理解除了第二行最后一部分 "awk '{ print $2 }' | tr '\n' ' ' )" 之外的所有内容。你能详细解释一下这两个管道符号的作用吗? - TrailRider
没问题。我编辑了一些解释。 - Brian Huggins
3所以...你在清除depends的时候没有检查其他软件包是否也依赖于它们吗? - steeldriver
是的,我注意到可能会有不良副作用的可能性。当删除PACKAGENAME、自动删除PACKAGENAME、--purge自动删除PACKAGENAME等方法仍然无法完成任务时,我会不时地使用这种方法作为最后一招。这通常发生在元包上。在按下"Y"之前,我只需注意要删除的内容,如果出现了不正常的情况,我会取消并进行调查。如果需要更慢的步骤,还可以在awk之前添加额外的管道,使用grep recommends、grep replaces或grep conflicts等命令。 - Brian Huggins

我也使用 aptitude purge 来做这件事:
sudo aptitude purge <PACKAGENAME>

这个命令会移除依赖项,但不会移除那些同时也是其他已安装软件的依赖项。不过我不确定它是否会移除依赖项的配置文件。

1我可以确认它不会删除配置文件。 - Daniel Sokolowski

autoremove可能是你想要的。

举个例子,使用remove命令时,只会删除一个软件包:

$ sudo apt remove nvidia-cuda-toolkit
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  g++-8 javascript-common libaccinj64-10.1 libcublas10 libcublaslt10 libcudart10.1 libcufft10 libcufftw10 libcuinj64-10.1 libcupti-dev libcupti-doc libcupti10.1 libcurand10 libcusolver10 libcusolvermg10
  libcusparse10 libegl-dev libgl-dev libgl1-mesa-dev libgles-dev libgles1 libglvnd-dev libglx-dev libjs-jquery libjs-underscore libncurses5 libnppc10 libnppial10 libnppicc10 libnppicom10 libnppidei10
  libnppif10 libnppig10 libnppim10 libnppist10 libnppisu10 libnppitc10 libnpps10 libnvblas10 libnvgraph10 libnvidia-common-510 libnvidia-ml-dev libnvjpeg10 libnvrtc10.1 libnvtoolsext1 libnvvm3 libopengl-dev
  libpthread-stubs0-dev libstdc++-8-dev libthrust-dev libvdpau-dev libx11-dev libxau-dev libxcb1-dev libxdmcp-dev node-html5shiv nsight-compute nsight-systems nvidia-cuda-dev nvidia-cuda-doc nvidia-cuda-gdb
  nvidia-opencl-dev nvidia-profiler nvidia-visual-profiler ocl-icd-libopencl1 ocl-icd-opencl-dev opencl-c-headers openjdk-8-jre x11proto-core-dev x11proto-dev xorg-sgml-doctools xtrans-dev
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  nvidia-cuda-toolkit
0 upgraded, 0 newly installed, 1 to remove and 95 not upgraded.
After this operation, 67.1 MB disk space will be freed.

使用autoremote
$ sudo apt autoremove nvidia-cuda-toolkit
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  g++-8 javascript-common libaccinj64-10.1 libcublas10 libcublaslt10 libcudart10.1 libcufft10 libcufftw10 libcuinj64-10.1 libcupti-dev libcupti-doc libcupti10.1 libcurand10 libcusolver10 libcusolvermg10
  libcusparse10 libegl-dev libgl-dev libgl1-mesa-dev libgles-dev libgles1 libglvnd-dev libglx-dev libjs-jquery libjs-underscore libncurses5 libnppc10 libnppial10 libnppicc10 libnppicom10 libnppidei10
  libnppif10 libnppig10 libnppim10 libnppist10 libnppisu10 libnppitc10 libnpps10 libnvblas10 libnvgraph10 libnvidia-common-510 libnvidia-ml-dev libnvjpeg10 libnvrtc10.1 libnvtoolsext1 libnvvm3 libopengl-dev
  libpthread-stubs0-dev libstdc++-8-dev libthrust-dev libvdpau-dev libx11-dev libxau-dev libxcb1-dev libxdmcp-dev node-html5shiv nsight-compute nsight-systems nvidia-cuda-dev nvidia-cuda-doc nvidia-cuda-gdb
  nvidia-cuda-toolkit nvidia-opencl-dev nvidia-profiler nvidia-visual-profiler ocl-icd-libopencl1 ocl-icd-opencl-dev opencl-c-headers openjdk-8-jre x11proto-core-dev x11proto-dev xorg-sgml-doctools xtrans-dev
0 upgraded, 0 newly installed, 73 to remove and 95 not upgraded.
After this operation, 3,654 MB disk space will be freed.

此外,由于OP正在询问如何进行深度清理,我们希望使用purge命令而不仅仅是remove以及autoremove命令行选项旁边的--purge。这样一来,所有东西都应该被彻底删除。当然,软件包维护者必须确保这一点... - Alexis Wilke

这将删除指定的软件包、所有自动安装的软件包以及它们的配置文件。
sudo apt-get -s purge <PKG> | grep '^ ' | tr -d '*' | xargs -o sudo apt-get purge

或者以root身份:
apt-get purge `apt-get -s purge <PKG> | grep '^ ' | tr -d '*'`

将""替换为您想要完全删除的软件包或软件包。