不小心运行“apt install *”,现在所有软件包都被标记为“手动安装”

不小心运行“apt install *”,现在所有软件包都被标记为“手动安装”

一不小心就跑apt install '*'了虽然由于冲突(例如多个版本的vim编辑器),它没有安装任何东西,但所有安装的软件包都失去了它们的“自动”属性,这意味着我无法再享受 APT 的自动依赖性检查。也就是说,如果我删除vim, apt 不再提示我删除vim-runtime。我使用的是高级打包工具的精简版本,因此apt-mark不可用。如何automatic为他人抚养的人恢复财产?

注意:我有aptapt-getapt-cacheapt-configapt-key可用。

答案1

在 Debian 及其衍生版本上,有关手动安装与自动安装的信息存储在/var/lib/apt/extended_states.没有自动备份,也没有日志。如果您有该文件的备份,请将其恢复。

如果您没有备份,请先制作一个备份,以防万一。然后,对于每个包,将行更改Auto-Installed: 0Auto-Installed: 1将包标记为手动安装。

APT 本身并不跟踪已安装软件包的依赖关系,这是由 dpkg 完成的。该信息位于/var/lib/dpkg/statusDebian 上。 Aptitude 具有高级搜索功能,可以对依赖项进行操作,但 apt 不行。您可以对 进行一些临时解析/var/lib/dpkg/status。以下脚本(经过最低限度的测试)生成一些已安装的软件包所依赖的软件包列表:

</var/lib/dpkg/status awk '
    /^Package:/ {package=$2}
    /^Status:/ && $4 != "installed" {package=""}
    /^(Depends|Pre-Depends|Recommends|Suggests):/ && package != "" {
        sub(/^[^:]*: */, "");
        gsub(/ (\([^()]*\))/, "");
        split($0, dependencies, /[|, ]+/);
        for (d in dependencies) print dependencies[d]}
' | sort -u >dependencies.txt

查看该列表,也许删除一些恰好是依赖项的包行,但您知道无论如何您都想保留它们。然后用它来调整/var/lib/apt/extended_states

</var/lib/apt/extended_states awk '
    BEGIN {
        while (getline <"dependencies.txt") auto[$0]=1;
        RS="";
    }
    $2 in auto {sub(/\nAuto-Installed: 0/, "\nAuto-Installed: 1")}
    {print $0 "\n"}
' >extended_states.new

检查输出文件,如果您满意,请将其移至适当位置。

相关内容