我注意到大量的包的residual-config
状态为,apt list
在删除它们之前,我想确保它不会删除任何重要信息,我怎样才能显示将要删除的文件列表?
答案1
要查看将删除的内容,您必须检查相应的 postrm 脚本,例如/var/lib/dpkg/info/packagename.postrm
来自man dpkg
(缩写):
注意:某些配置文件可能不为 dpkg 所知,因为它们是通过配置脚本单独创建和处理的。在这种情况下,软件包的后脚本必须负责删除它们。这仅适用于系统目录中的文件。
清除包包括:
移除包裹。
运行 postrm 脚本。
答案2
以下一行代码向您显示所有带有残留配置文件的软件包以及每个软件包的上述文件列表:
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
解释:
apt-cache show '?config-files'
:显示过时的配置文件适当的搜索模式。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'
这不会影响已安装的软件包,但我建议谨慎使用。
警告:apt purge '?config-files'
可以删除您意想不到的任意内容。使用时请小心,并先备份重要数据(数据库、凭证等)。--dry-run
如果不确定,请先尝试使用。
答案3
结合以下答案@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