如何纠正已安装包的自动/手动安装标志?

如何纠正已安装包的自动/手动安装标志?

我在新的联想 T470 上安装了 Ubuntu。为了安装与旧笔记本相同的软件包,我在旧笔记本上创建了一个已安装软件包列表,然后使用以下命令在新联想上安装了这些软件包如何列出所有已安装的软件包

现在我几乎将所有软件包都标记为手动安装(我读到一些评论太晚了) -autoremove无法正常工作。

我想将依赖包的 manual/auto 标志更正为 auto。

我想我需要采取以下步骤:

  1. 创建所有已安装软件包的列表

    apt-mark showmanual >installed_packages.txt
    apt-mark showauto >>installed_packages.txt
    
  2. 检索依赖项(相当漫长的过程)

    for PACKAGE in $( sort installed_packages.txt ); do
        apt-cache depends ${PACKAGE} --important -q --installed | awk '/epends:/ {print $2}' >>dependencies_all.txt
    done
    sort -u dependencies_all.txt > dependencies_uniq.txt
    

    注意--importantapt-cache 选项。AWK 将仅打印软件包名称Depends:PreDepends:

  3. 为所有依赖包设置自动标志

    cat dependencies_uniq.txt | xargs sudo apt-mark auto
    

这些步骤正确吗?apt-cache depends --important安装软件包时,检索到的依赖项是否与 APT 选择安装的依赖项相同?

有没有更好的方法来纠正这些标志?

答案1

使用 Python Apt API 可能更有效率,特别是在获取依赖项时:

#! /usr/bin/python3
from apt import cache

c = cache.Cache()
pkgs = set(pkg for pkg in c if pkg.is_installed)
seen = set()

def mark_deps(pkg):
    for dep in pkg.installed.dependencies:
        for ver in dep.installed_target_versions:
            if ver.package not in seen:
                seen.add(ver.package)
                pkg.mark_auto()
                mark_deps(ver.package)


for pkg in pkgs:
    mark_deps(pkg)

print(c.get_changes())
c.commit()

虽然速度仍然会比较慢,但应该比调用 apt-cache 数千次要快。不使用 sudo 运行以查看将进行哪些更改(c.commit()将失败),然后使用 sudo 运行sudo以执行这些更改。

答案2

使用aptitude,您可以设置一个限制(按“l”,小写L),然后输入此咒语以查看所有已安装但未标记为自动的软件包,但将它们标记为自动不会卸载它们,因为有另一个已安装的软件包已经依赖于它们:

?and(?or(?reverse-predepends(~i),?reverse-depends(~i)),?and(~i,!~M))

下面显示了您安装的所有未标记为自动且没有任何依赖项的软件包:

?and(?not(?or(?reverse-predepends(?and(~i,!~M)),?reverse-depends(?and(~i,!~M)))),?and(~i,!~M))

(按下G并使其显示“任务,状态”以使列表更易于阅读。)

相关内容