我没有找到任何适用于我的解决方案,我已经用dpkg安装了很多deb软件包,而我特别寻找的一些项目却丢失了。
一个相当长的衬纸,但可以方便地复制和粘贴:
export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS
上面的命令将软件包列表保存到当前工作目录中名为的文件中my-packages
。
说明
我首先建立了一个软件包列表,这些列表构成了安装期间选择的软件包的基准。
zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial
其次是一长串一般安装的物品。
awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed
然后,我比较了两个文件initial
,installed
仅列出了安装所特有的项目。
comm -23 installed initial > custom
从那里开始,我想过滤出依赖关系,这是此方法可能会遗漏某些所需软件包的地方,它没有意识到也已明确安装的依赖关系。
我编写了一个快速bash函数来缩短处理这些项目的步骤。
function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }
之后,我使用将从文件的每一行传递custom
到此函数xargs
。
echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps
一旦获得了所有可能依赖项的详细清单(不确定每个可能的语句),我再次获得了单个文件所独有的行。
comm -23 custom deps > manual
现在,我已完成的软件包列表在一个名为manual
供我查看的文件中。
something
而不是something-common
那么好。