如果我有一个正在运行的 debian 系统,可以发出以下命令来获取已安装软件包的列表:
dpkg --get-selections > packages.lst
但现在我只有工作系统的根分区的完整备份(完整的系统备份),仅此而已。如何从这些文件生成已安装软件包的列表?
答案1
chroot 进入它,然后运行 dpkg 将是最简单的事情。看https://superuser.com/a/417004/20798了解如何在 chroot 中获取可用的/proc
, /sys
, 和。/dev
由于您在备份之外有一个工作的 Debian 系统,您可能可以使用
dpkg --admindir=dir --get-selections
默认dir
为/var/lib/dpkg
,因此请将路径放入备份的/var/lib/dpkg
.
不要忘记,它dpkg --get-selections
不会显示哪些软件包是手动安装的,哪些软件包只是为了满足依赖关系而安装的(因此当不再需要时应该自动删除,因为您实际想要的软件包的新版本具有不同的依赖关系,或者因为您清除了手动安装的软件包。)
我用的是 aptitude,这样很容易标记一切作为自动安装,然后检查并将一些软件包标记为手动安装,直到您想要保留的内容都不会被自动删除。从大型元包开始,例如、和build-essential
的 Debian 等效项,以及类似的东西。在 aptitude 中,点击查看软件包的反向依赖项(依赖于它的 pkg)。ubuntu-standard
ubuntu-desktop
r
答案2
彼得的方法更好,但你也可以只解析/var/lib/dpkg/status
不需要chroot
:
$ perl -00ne 'if(/: install/){/Package:\s*(\S+)/ && print "$1\n"}' /var/lib/dpkg/status
在我的机器上,它返回相同的包列表dpkg --get-selections | awk '$NF=="install"{print $1}'
(awk
需要解析,因为否则它还会显示已卸载的包)。
答案3
您可以使用以下命令列出您的软件包:
awk '/Package:/ {print $2}' /var/lib/dpkg/status