我正在寻找一种将已安装的软件包重置为默认状态的方法,其中包括
删除所有手动安装的包
重新安装安装程序中包含但后来被我手动删除的软件包
不重新安装整个系统可以吗?
答案1
对于所有通过 Google 来到这里的人,我写了以下命令好像输出手动删除的软件包列表。对我来说,这个命令有用,但我不知道它是否正确。
comm -23 \
<( comm -23 <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u) <(dpkg -l | grep ^ii | awk -F"[ :]" '{print $3}' | sort -u) ) \
<( gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Depends: //p' | awk '{split($0, packages, ", |\| "); for (key in packages) { printf "%s\n", packages[key] } }' | awk '{print $1}' | sort -u )
该命令的第二行比较安装后立即安装的包的列表和当前安装的包的列表,得出用户删除的预安装包的列表,包括依赖项。
第三行输出安装后立即安装的依赖包列表。
通过比较第二行和第三行的输出,我们得到了在 Ubuntu 设置中安装但后来被用户删除的软件包列表,不包括依赖项。
如果您在安装后更新了 Ubuntu,则应使用下面的命令,它会从上述命令的输出中删除系统更新期间卸载的软件包。
# Fill in Ubuntu version being installed to your computer in the first place
initial_ubuntu_version="19.10"
# Fill in currently installed Ubuntu version
current_ubuntu_version="20.04"
comm -23 \
<(
# All removed preinstalled packages, excluding dependencies (same as the command above)
comm -23 \
<( comm -23 <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u) <(dpkg -l | grep ^ii | awk -F"[ :]" '{print $3}' | sort -u) ) \
<( gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Depends: //p' | awk '{split($0, packages, ", |\| "); for (key in packages) { printf "%s\n", packages[key] } }' | awk '{print $1}' | sort -u )
) \
<(
# Packages being removed during system update
comm -23 \
<( wget "http://releases.ubuntu.com/$initial_ubuntu_version/ubuntu-$initial_ubuntu_version-desktop-amd64.manifest" -q -O - | cut -f 1 | awk -F"[ :]" '{print $1}' | sort -u ) \
<( wget "http://releases.ubuntu.com/$current_ubuntu_version/ubuntu-$current_ubuntu_version-desktop-amd64.manifest" -q -O - | cut -f 1 | awk -F"[ :]" '{print $1}' | sort -u )
)
运行上述命令后,您可以用 逐个重新安装这些软件包sudo apt install [package-name]
,apt 将自动为您安装依赖项。
您还可以使用以下命令获取手动安装的软件包列表(来源)然后用 逐一移除它们sudo apt remove [package-name]
。
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
上述所有代码片段均已获得许可CC0。