我想备份我在 Ubuntu 中手动选择的软件包列表,而不列出作为依赖项安装的软件包。例如,
dpkg --get-selections
返回所有已安装软件包、手动选择的软件包以及依赖项的完整列表。如何过滤依赖项?
答案1
我自己找到了一个解决方案:)
dpkg --get-selections | cut -f 1 > /tmp/all
apt-mark showauto > /tmp/auto
diff /tmp/all /tmp/auto | grep '<' | sed 's/.* //'
这将首先生成已安装软件包的完整列表“全部”,然后生成自动安装软件包的列表“自动”,最后创建一个所有软件包和自动软件包的差异列表,这就是我需要的列表。
还有更好的建议吗?
答案2
您可以过滤掉 lib 包,然后手动过滤剩余的包。我认为没有标准的方法来做到这一点。
dpkg --get-selections |wc -l
1831
dpkg --get-selections |grep -v ^lib | wc -l
1060
答案3
# 假设你的 dpkg 日志可以追溯到最初的机器安装
###(可能/可能无法跨 dist-upgrades 工作)
apt-mark showauto >/tmp/auto.pkgs
cp /dev/null /tmp/dpkg.full
for LOG in $(ls -rt /var/log/dpkg.log.[0-9].gz /var/log/dpkg.log.1[0-9].gz)
do
test -e $LOG && gunzip -c $LOG>> /tmp/dpkg.full
done
for LOG in $(ls -rt /var/log/dpkg.log /var/log/dpkg.log.[0-9] /var/log/dpkg.log.1[0-9])
do
test -e $LOG && cat $LOG >>/tmp/dpkg.full
done
现在将操作系统最初安装的软件包归档
awk -v initialinstall=1 '
/ install grub-pc / {initialinstall = 0; next;}
/ install / {if ( initialinstall == 0) print $4;}
' /tmp/dpkg.full | grep -vf /tmp/auto.pkgs >~/iInstalled.pkgs
答案4
如果您想要一份未标记为自动安装的软件包列表(这并不总等同于不存在依赖项),您可以使用更简单的方法执行此操作,aptitude
如下所示:
aptitude search ~i | grep "^i " | awk '{ print $2 }'
如果您真的想清除所有依赖项,可以研究~R
和~D
搜索模式。我认为aptitude
是目前推荐的 dpkg 和 apt 前端。您会发现,除了 ncurses 界面外,它还有许多非常有用的命令行选项。