如何列出已删除软件包的剩余配置文件?

我注意到在apt list中有很多状态为"residual-config"的软件包,但在删除它们之前,我想确保不会删除任何重要信息,我该如何显示将被删除的文件列表?

关于“如何显示将要被删除的文件列表?”请在回复中附上您打算使用的删除命令。 - DK Bose
嗨,谢谢你的帮助,但我已经找到了答案,只是在这里发布分享一下。不幸的是,我还需要等待两天才能将其标记为已解决。 - int_ua
但是还有改进的空间。你可以尝试编写一个脚本,将所有相关的postrm脚本连接起来。至于命令方面,我通常使用apt-get purge - int_ua
当我运行apt list命令时,我只会得到一个类似这样的软件包列表:package_name/version/(amd64|i386|all)。没有提及状态信息。如何通过apt list命令获取状态信息呢?我可以使用dpkg --list | grep ^rc命令来获得相同的信息。 - DK Bose
它只是列出所有可用的软件包,至少在apt 1.0.10.2ubuntu1版本中,这将显示所有带有状态的软件包:apt list | grep "\[.*\]" - int_ua
3个回答

要查看将被删除的内容,您需要检查相应的postrm脚本,例如/var/lib/dpkg/info/packagename.postrm。
来自man dpkg(缩写):
注意:由于配置脚本单独创建和处理,因此某些配置文件可能对dpkg来说是未知的。在这种情况下,软件包的postrm脚本必须负责删除它们。这仅适用于系统目录中的文件。
清除软件包的步骤包括:
1. 删除软件包。 2. 运行postrm脚本。

4也许值得将以下命令添加到这个答案中:for i in $(dpkg --list | awk '{if ($1 == "rc") {print $2}}'); do if [ ! -f /var/lib/dpkg/info/$i.postrm ]; then sudo apt-get purge -y $i; fi; done - Martin Bonner supports Monica
1它过滤掉所有处于“rc”状态但没有postrm脚本(因此不执行任何操作)的包(我刚刚删除了20个左右这样的包)。 - Martin Bonner supports Monica

这里有一个简洁的命令,可以显示所有带有残留配置文件的软件包,并列出每个软件包的相关文件列表。
apt-cache show '?config-files' | grep -oP '^Package: \K(.*)$' | uniq | xargs -I '0' dpkg-query -W --showformat "\${binary:Package}:\n\${db-fsys:Files}" '0'

示例输出:

postgresql-13:
postgresql-common:
 /etc
 /etc/init.d
 /etc/init.d/postgresql
 /etc/logrotate.d
 /etc/logrotate.d/postgresql-common
 /etc/postgresql
 /etc/sysctl.d
 /etc/sysctl.d/30-postgresql-shm.conf
 /var
 /var/lib
 /var/lib/postgresql
 /var/log
 /var/log/postgresql

Explanation:

  • apt-cache show '?config-files': 按照 apt search patterns 显示过时的配置文件。
  • grep -oP '^Package: \K(.*)$' | uniq: 过滤软件包名称并从前一步骤中去除重复的输出。
  • xargs -I '0' dpkg-query -W --showformat "\${binary:Package}:\n\${db-fsys:Files}" '0': 将软件包名称传递给 dpkg-query 并打印 Package 字段(软件包名称)和一个特殊的 db-fsys:Files 字段,其中列出了当前在您系统上安装的该软件包的所有文件。

注意:您也可以使用以下命令清理系统中的所有剩余配置文件:

sudo apt purge '?config-files'

这不会触及已安装的软件包,但我建议小心一点。

谢谢,这是一个很好的答案。不幸的是,我暂时不能将其标记为主要接受的答案。在db-fsys:Files中提到了postrm脚本中不存在的文件。例如,我检查了tor软件包,postrm中包含rm -f "/etc/apparmor.d/disable/system_tor",而在dpkg-query -W --showformat "\${binary:Package}:\n\${db-fsys:Files}" tor中却没有。这是否符合预期? - int_ua
@int_ua 不客气,这是预期的行为,因为.deb软件包没有明确安装的内容apt不会知道,但它给你一个大致的方向去寻找,因为大多数软件包在安装时会使用这种方法来创建配置目录。 - voodooattack
1非常感谢!有一个小提示:某些软件包可能不会显示配置文件。以我的例子来说,我安装了LXD,并且对建议的删除操作的影响感到不确定。我访问了https://packages.ubuntu.com/,搜索了该软件包,并经过一些更多的研究(在不同版本之间切换)、猜测和查看snap list的输出后,我确信它已成为一个过渡性软件包,功能现在由一个snap提供,因此可以放心地删除该软件包。 - LiveWireBT
1在运行apt purge '?config-files'之前,请务必备份所有内容;它抹掉了我的Maria数据库! - Lamp
1@Lamp 是的。在我看来,这是一个糟糕的设计。他们应该添加一个'?data-files'或者其他用于将这类东西与配置文件分开处理的方法。我会在答案中加上一个警告。 - voodooattack
--dry-run 并没有真正帮助。它只列出了软件包,而没有列出文件。同时,大多数软件包在该列表中会显示 /etc,但(希望)不会删除它。 - undefined

结合来自@voodooattack和@int_ua的回答
#!/bin/bash

set -eo pipefail

apt-cache show '?config-files' | grep -oP '^Package: \K(.*)$' | uniq | while read -r pkg; do
    dpkg-query -W --showformat "\${binary:Package}:\n\${db-fsys:Files}" "${pkg}"
    if [[ -e /var/lib/dpkg/info/${pkg}.postrm ]]; then
        echo " postrm:"
        sed 's/^/  /' /var/lib/dpkg/info/${pkg}.postrm
    fi
done

我的系统上的示例输出:
$ apt-list-residual-files.sh 
libatk-adaptor:amd64:
 /etc
 /etc/X11
 /etc/X11/Xsession.d
 /etc/X11/Xsession.d/90atk-adaptor
 /etc/environment.d
 /etc/environment.d/90atk-adaptor.conf
xbrlapi:
 /etc
 /etc/X11
 /etc/X11/Xsession.d
 /etc/X11/Xsession.d/90xbrlapi
 postrm:
  #!/bin/sh
  set -e
  # Automatically added by dh_installdeb/13.11.6ubuntu1
  dpkg-maintscript-helper rm_conffile /etc/X11/Xsession.d/60xbrlapi 6.1\+dfsg-2\~ xbrlapi -- "$@"
  # End automatically added section