代码之家  ›  专栏  ›  技术社区  ›  fadedbee

如何列出重新创建一组已安装的软件包所需的Debian软件包的最小集合?

  •  8
  • fadedbee  · 技术社区  · 15 年前

    有没有办法让DPKG、APT GET或有能力生成需要安装在第二台机器上以复制安装在第一台机器上的包的列表?

    例如,如果我安装了一个普通的Ubuntu服务器,在安装时选择sshd选项,然后安装build-essential,我希望输出看起来像:

    #ubuntu 9.10 server
    openssh-sshd
    build-essential
    

    据我所见,所有可用的打包工具都将在一个盒子上生成一个详细的包列表。我对openssh libs、ld、gcc以及sshd和build-essential拉入的所有其他包不感兴趣,因为它们将在我安装sshd和build-essential时安装。

    我只想看到在另一台计算机上重新创建当前包集所需安装的包的列表。

    这有可能吗?

    4 回复  |  直到 12 年前
        1
  •  11
  •   Eric Warmenhoven    15 年前

    deborphan 有点像。它构建了系统中每个包的列表,找出依赖于什么的包,并打印出没有任何依赖关系的包。默认情况下,它只打印库(以便于查找由其他包安装且不再需要的库,因此命名)。它有做你想做的事情的选择,主要是。我运行它像:

    deborphan -anp required --no-show-section

    -a 指定所有包(不仅仅是库)
    -n 忽略“建议”或“建议”依赖性检查(即仅“依赖”)。
    -p required 列出所有包,尽管优先级不同
    --no-show-section 并不表示它在Debian的哪个部分,只是一个很好的格式化功能,您可能会发现它对构建一个列表很有用。

    现在,它将错过包,因为有些包具有循环依赖关系。但这往往是相当罕见的,所以它应该让你足够接近。

        2
  •  2
  •   bta    15 年前

    Dannysauer发布的代码是一个开始。一旦有了包含依赖项的包列表,就可以使用 apt-rdepends 查找特定包的依赖项(请参见 this page 例如使用和输出)。

    程序大纲

    1. 遍历包列表 由Dannysauer的代码返回
    2. 呼叫 APT依赖 在每一个
    3. 从列表中删除在输出中显示的所有包 APT依赖
        3
  •  1
  •   dannysauer    15 年前

    所以,您想要显式安装的包列表(比如,Ubuntu桌面和OpenSSH),而不是自动依赖项?我不是很乐观,但我想这就是 dpkg --get-selections 做。所以,你可以

    dpkg --get-selections > file
    

    然后,在另一台计算机上,使用相同的“文件”并运行

    dpkg --set-selections  < file
    apt-get dselect-upgrade
    

    我不是 绝对积极 不过,这些命令只是执行手动选择的包,而我目前不在任何基于Debian的系统上进行验证。:)

        4
  •  0
  •   dashohoxha    12 年前

    这个怎么样:

    #!/bin/bash
    
    packages=$(dpkg --get-selections | grep '[[:space:]]install$' | awk '{print $1}')
    
    for pkg in $packages
    do
        nr_lines=$(apt-cache -i rdepends $pkg | wc -l )
        if [ "$nr_lines" = "2" ]
        then
            echo $pkg
        fi
    done
    

    它工作得好吗?它能有所改进吗?