工作过程中,有一个不常见的需求,所以我在网上也没有找到直接的解决方案。需求是在 Ubuntu 中,找到已经安装的 deb 包,这些包是没有依赖其它已经安装的包的。

有这个需求的原因是,我需要把产品从 Ubuntu 移植到 Debian,但很难知道产品都依赖了那些 deb,如果知道依赖了哪些 deb,在 Debian 上把这些 deb 包先装好,那移植起来就会顺利很多。

如果是查系统已经安装的包很简单,使用命令 apt list --installed 就可以列出。但列出的包太多了,主要原因是里面包含很多底层的包,基础的包,这些包对我来说其实是没意义的,我想要知道的是是我最终使用的包。

说到这里,其实可以想到也可以去查系统究竟用 apt 命令来安装过哪些包,例如用 history 命令,但我这里记录不全,不能用这个方法。

网上并没有找到简单解决的办法,但经过搜索通过几个命令的组合就可以实现我的需求。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

# 获取所有已经安装的包
installed_deb_list=`apt list --installed | awk -F '/' '{print $1}'`
# 从已安装的的包中找出他们的依赖
rdep_res=`apt-rdepends --state-follow=Installed --state-show=Installed  -r $installed_deb_list`
IFS=$'\n'
rdep_arr=($rdep_res)

# 判断哪些包没有依赖其它包
deb=""
for item in "${rdep_arr[@]}";do
        if [[ ${item:0:1} == " " ]]; then
                deb=""
        else
                if [[ $deb != "" ]]; then
                        echo $deb # 打印没有依赖其它包的包名
                fi
                deb=$item
        fi
done