我即将将服务器从一个Ubuntu盒子移到另一个盒子。我不是将旧的盒子复制到新的盒子。我正在创建一个新系统,并将根据需要移动数据。我想在新机器上的旧机器上安装所有我拥有的软件。随着时间的推移?也就是说,dpkg -l显示所有已安装的软件包,但不会显示哪个顶级软件包安装了它们。如果dpkg有办法给我安装软件包,我可以在那里找到独特的软件包。否则,我想让其他人说“您安装了这24个软件包”。

评论

啊哈!之前已经有人问过了,答案很好。

您可以接受以下答案吗?要感谢回答的人。

如何获取Debian上所有根目录/主要安装软件包的列表的可能重复

这些解决方案将仅检查上一次日志旋转之后发生的情况。他们不会检查所有历史记录。

这个问题的答案,askubuntu.com / a / 250530/197730,给出了简单快速的方法。如何列出所有已安装的软件包。

#1 楼

如上面的评论中所述,apt的历史记录在/var/log/apt/history.log中。就是说,这不会列出使用dpkggdebi之类的GUI手动安装的软件包。要查看通过dpkg的所有软件包,可以查看/var/log/dpkg.log

#2 楼

您可以列出已通过apt-mark明确要求安装的软件包。 >
以下命令提供了手动或自动请求安装的软件包列表。除非您正在(正在)安装软件包中,否则这是已安装软件包的列表。

apt-mark showmanual


以下命令提供了自动安装的软件包的超集:

dpkg --get-selections | sed -n 's/\t\+install$//p'


将它们放在一起,以下命令列出了手动安装的软件包:

</var/lib/apt/extended_states awk -v RS= '/\nAuto-Installed: *1/{print}'


评论


---与comm -23截然不同的结果<(apt-mark showmanual | sort -u)<(gzip -dc /var/log/installer/initial-status.gz | sed -n's / ^ Package:// p'|排序-u)

– Cbhihe
2015年10月27日15:09

在Debian上,有apt-mark showmanual等效于您的上一个命令。

–maxschlepzig
17年1月22日在15:55

#3 楼

http://www.debianadmin.com/clone-your-ubuntu-installation.html

和/var/adm/apt/history.log

评论


第一个链接中的过程不区分自动安装的软件包和手动安装的软件包。 /var/log/apt/history.log(您的位置错误,顺便说一句)将在几个月后消失。

–吉尔斯'所以-不再是邪恶的'
10年8月28日在7:55

吉尔斯在两个方面都是对的。我只有大约一个月的日志价值,而且我什至看不到日志删除率的设置方式(在FreeBSD上是通过'newsyslog'完成的)。所以我仍然没有解决方案,但是我有一些建议。我至少可以在克隆文章中grep命令的输出,查找“高级”名称,将其安装在新名称上,在新框中执行相同操作,比较两个结果,然后重复直到满意为止。我仍然希望听到更多的想法。

– Paul Hoffman
10年8月29日在15:42

#4 楼

我还以这种方式“压缩” tar.gz版本的历史记录文件:

#5 楼

grep -i "Commandline" /var/log/apt/history.log


显示您使用以下各项安装的所有软件包:sudo apt-get install xxxxx

评论


这与@ℝaphink的答案相差无几,应该对此做一个评论。

–卡尔·里希特(Karl Richter)
17年6月17日在16:16

#6 楼

最好不要使用tac / head组合,而要​​使用尾部(最后25行):

tail -n 25 /var/log/apt/history.log


评论


这与@ℝaphink的答案相差无几,应该对此做一个评论。

–卡尔·里希特(Karl Richter)
17年6月17日在16:16

另外,也不一样。 tail将按照它们在文件中的顺序列出文件中的最后几行。 tac会颠倒顺序,以便最后一行现在是第一行,倒数第二行是第二行,依此类推。同样,当您说某事“更好”而不解释原因时,似乎冒着错误的风险。我的意思是,“更好”是根据谁?有什么要求?似乎有点过分自信。

–托德·沃尔顿(Todd Walton)
18年7月6日在18:36

#7 楼

其他答案有帮助,但给了我太多的输出。为了减少输出,我在此答案中以apt-mark showmanual开始,然后滤除了最初安装的软件包(有关如何获取最初安装的软件包列表的信息,请参见此答案;我使用的是ubuntu 18.04.2,因此下面的链接)。

BASE_PACKAGES_MANIFEST=http://releases.ubuntu.com/18.04.2/ubuntu-18.04.2-desktop-amd64.manifest
REMOVE_VERSIONS_REGEX='[0-9][.-][0-9][.-][0-9]|[0-9][.-][0-9]|[0-9]'
paste  <( apt-mark showmanual ) <( apt-mark showmanual | sed -r "s/$REMOVE_VERSIONS_REGEX//g" ) |
    grep -vf <( curl $BASE_PACKAGES_MANIFEST | cut -f1 | sed -r "s/$REMOVE_VERSIONS_REGEX|:amd//g" ) |
    cut -f1 |
    sort |
    uniq


该脚本通过进行与版本无关的比较来筛选出原始清单中的软件包,从而使升级后的软件包不会出现在列表中。我最终得到了大约60个软件包的列表。

我喜欢的另一种方式是搜索所有apt日志的答案。

#8 楼

要按降序获取最新安装的软件包列表,我喜欢使用(例如25行):

tac /var/log/apt/history.log |head --lines=25


评论


更有效的(和替代的)是:tail -25 /var/log/apt/history.log | TAC

–agc
17年4月4日在13:35

这与@ℝaphink的答案相差无几,应该对此做一个评论。

–卡尔·里希特(Karl Richter)
17年6月17日在16:17