如何在Ubuntu上获取“ apt-get install”的历史记录?


85

我即将将服务器从一个Ubuntu盒子移到另一个盒子。我不是将旧的盒子复制到新的盒子。我正在创建一个新系统,并将根据需要移动数据。我想在新盒子的旧盒子上安装我拥有的所有软件。

有没有一种简单的方法来查找我随时间给出的所有“ sudo apt-get install”命令的历史记录?也就是说,dpkg -l显示所有已安装的软件包,但不会显示哪个顶级软件包安装了它们。如果dpkg有办法给我安装软件包,我可以在那里找到独特的软件包。否则,我想让其他人说“您安装了这24个软件包”。



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


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

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

Answers:


68

如上面的评论中所述,apt历史已经存在/var/log/apt/history.log。也就是说,这不会列出使用dpkg或GUI等手动安装的软件包gdebi。要查看所有经过的软件包dpkg,请查看/var/log/dpkg.log


8

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

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

7

您可以使用列出已明确要求安装的软件包apt-mark

apt-mark showmanual

如果您运行的是Debian的较早版本,请使用手动方式。

以下命令提供了手动或自动请求安装的软件包列表。除非您正在(正在)安装软件包中,否则这是已安装软件包的列表。

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

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

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

综上所述,以下命令列出了手动安装的软件包:

comm -23 <(dpkg --get-selections | sed -n 's/\t\+install$//p') \
         <(</var/lib/apt/extended_states \
           awk -v RS= '/\nAuto-Installed: *1/{print$2}' |sort)

1
---与comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Cbhihe

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

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

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


这与@ℝaphink的答案没有太大不同,应该对此做一个评论。
Karl Richter

2

而不是TAC /头组合,最好使用尾部(最后25行):

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

这与@ℝaphink的答案没有太大不同,应该对此做一个评论。
Karl Richter

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

0

其他答案有所帮助,但给了我太多的输出。为了减少输出,我开始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日志的答案


-1

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

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

1
更有效的(和替代性的)将是: tail -25 /var/log/apt/history.log | tac
AGC

这与@ℝaphink的答案没有太大不同,应该对此做一个评论。
Karl Richter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.