列出明确安装的软件包


53

在Gentoo中,有一个文件/var/lib/portage/world包含我明确安装的软件包。明确地说,这是我选择的软件包,不包括默认情况下安装的软件包或不依赖项引入的软件包。

是否有类似的文件或命令可在Ubuntu中找到该信息?

Answers:


46

只是代码

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

说明

思考此问题的一种方法是将其分为三个部分:

  • 如何获取未安装为依赖项的软件包列表?
  • 如何获取默认安装的软件包列表?
  • 如何获得这两个列表之间的区别?

如何获取未安装为依赖项的软件包列表?

以下命令似乎可以在我的系统上运行:

$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt

可以在Gilles发表的对该问题的评论链接中找到类似的方法。一些消息来源声称这仅在您使用aptitude安装软件包时才有效。但是,我几乎从不使用aptitude来安装软件包,并且发现这仍然有效。在--disable-columns防止从与该会妨碍下面的比较坯料的包名称的填充线性向。在| sort -u各种各样的文件,并删除重复项。这使最后一步容易得多。

如何获取默认安装的软件包列表?

注意:本节以“错误的路径”开始,我认为这是说明性的。第二段代码是有效的代码。

这有点棘手。最初,我认为所有与元软件包ubuntu-minimal,ubuntu-standard,ubuntu-desktop和各种linux内核相关的软件包相关的软件包都是一个很好的近似。Google搜索的一些结果似乎使用了这种方法。为了获得这些依赖关系的列表,我首先尝试了以下操作(无效):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

这似乎遗漏了一些我必须默认提供的软件包。我仍然相信,如果构建正确的元软件包列表,则此方法应该可以工作。

但是,似乎Ubuntu镜像包含一个“清单”文件,其中包含默认安装中的所有软件包。Ubuntu 12.04.3的清单在这里:

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest

如果您搜索此页面(或离您最近的镜像页面):

http://mirror.pnl.gov/releases/precise/

您应该能够找到与所使用的版本和体系结构相对应的“ .manifest”文件。要提取包名,我这样做:

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt

该列表可能已经排序并且是唯一的,但是我想确保对列表进行正确排序以使下一步更容易。然后将输出放入defaultinstalled.txt

如何获得这两个列表之间的区别?

这是最简单的部分,因为大多数类Unix系统都有许多工具可以执行此操作。该comm工具是执行此操作的多种方法之一:

comm -23 currentlyinstalled.txt defaultinstalled.txt

这将打印第一个文件唯一的行列表。因此,它应打印不在默认安装中的已安装软件包列表。


您的第一个管道没有aptitude search '~i!~M' -F %p做什么?
短暂

@ephemient:大概什么都没有。我对智能和使用过的工具不太了解,而不是深入研究从未使用过的程序的man文件。
史蒂文D

1
您有点破坏了我的希望,我认为这是一种简单的标准方法:(
phunehehe 2010年

3
这几乎可行,但仍然不正确。结果列表中确实包含多个我没有手动安装的软件包和库。我使用http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifest了额外的| sed "s/ *$//"骰子,但仍然没有。
jmiserez 2014年

1
获取其他未安装软件包列表的第一步可以用代替apt-mark showmanual | sort -u,如其他答案所示。更简单,并且不依赖aptitude默认情况下未安装的哪个。
2015年

24

您可以使用这两个单线之一。两者在我的机器上都能产生完全相同的输出,并且比迄今为止(在2014年7月)提出的所有解决方案都更精确。它们是两个答案(1)(2)的组合。请注意,我最初将此答案发布在此处

使用apt-mark

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

使用aptitude

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

只有极少数的包还是漏掉,虽然我怀疑这真正由用户安装,或者直接通过语言本地化安装程序在安装后,或例如,通过编解码器图腾安装。另外,即使我仅安装了非特定于版本的metapackage,Linux标头版本也似乎在累积。例子:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

它是如何工作的

  1. 获取手动安装的软件包的列表。为了适应性强,其他sed行将去除行尾的剩余空白。
  2. 全新安装后,立即获得安装的软件包列表。
  3. 比较文件,仅输出文件1中不存在的行2。

其他可能性也不起作用:

  • 使用ubuntu-14.04-desktop-amd64.manifest文件(此处为Ubuntu 14.04)代替/var/log/installer/initial-status.gz。即使没有手动安装,也会显示更多软件包。
  • 使用apt-mark showauto代替/var/log/installer/initial-status.gzapt-mark例如,不包含xserver-xorg软件包,而另一个文件包含。

两者都列出了比上述解决方案更多的软件包。


如果您是在初次安装后就升级了系统(我认为大多数人都是这种情况),最好使用当前Ubuntu发行版的清单文件。
Diego V

如果您已经升级,我认为您需要使用两个文件,而不仅仅是清单文件。您只需添加另一个比较即可轻松做到这一点。不幸的是,清单文件没有包含initial_status.gz文件所做的所有事情(我检查过)。
jmiserez 2015年

我印象深刻!但是我发现了一块丢失的东西。最初安装但随后明确手动删除但后来又明确手动重新安装的软件包呢?我在工作系统中发现了这一点。
n611x007

1
我已经提出了一个问题unix.SE/225330:列出明确删除的软件包(apt)以解决大部分工作。
n611x007

1
这比接受更好的解决方案,因为mirror.pnl.gov/releases/precise/...在接受的解决方案URL现在是一个404
rmunn

9

根据man apt-mark

apt-mark showauto
apt-mark showmanual

2
showmanual显示类似的信息xserver-xorg-video-vesa,我发誓我没有手动安装。
phunehehe 2012年

可能是您的发行版在首次安装时自动安装的。
马特

8

以下是一些示例输出cat /var/log/apt/history.log

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

关于您的问题,请使用grep(cat /var/log/apt/history.log | grep Commandline)过滤内容。

请注意,这些文件是旋转的,因此请检查其他文件,以免丢失任何内容:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

注意

  • 我已经检查了智能突触(分别是版本0.700.6.3),并且它们都将活动记录在该日志文件中。他们遇到的一个挫折是他们没有以开头的行Commandline,所以这个grep技巧对他们不起作用。

2
有趣的解决方案。您将需要稍微调整grep命令,以获取软件包列表并说明由aptitude其他软件包管理器安装的软件包。如果您的日志已转开,那么您就不走运了。
史蒂文·D

@steven更新。我的grep-fu是新手,所以我留给读者看。另外,我不知道这东西是否会旋转。我只需要自己在那儿归档。
tshepang 2011年

它们是否旋转离开取决于您的logrotate设置以及系统运行了多长时间。我不确定Ubuntu的默认设置,因为自更改默认设置已有很长时间了。
史蒂文D

7

我在搜索此查询时遇到了这个美丽的oneliner

一个班轮是

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )`

此oneliner过滤系统使用以下来源的日志安装的软件包 /var/log/installer/initial-status.gz

找到链接后,我会将其发布到原始线程,因为此oneliner不是我的,而且我似乎不记得在哪里看到了它。


3

您可能想看一下这篇文章

在文章结尾,有一个python脚本可以执行您想要的操作。

它是为(k)ubuntu写的。但也应该适用于Ubuntu


3
该链接似乎不再起作用。
罗格

2
像这样的断开链接是为什么在答案中包含相关信息很重要的原因。
whitehat101

2

以下是Steven D的答案的补充。

以下行似乎在截断软件包名称,为32个字符:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

这似乎可行:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

看到这个答案


1

查看 /var/log/apt/term.log


2
这是做事的一种相当痛苦的方式,我自己安装的软件包与依赖项
引入的

我同意,但是我不知道apt可以跟踪这些信息:/现在,我要感谢Stefan :)
Joril 2010年

1

您也可以查看文件/var/lib/apt/extended_states

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

如果您想知道旧分区上安装了什么,这将很有用。


0

非常感谢和祝贺那些提出脚本的宝藏!!!
我想加2美分,并增加了从$ info推导出的安装日期。
我没有掌握$ info文件为何不更新以及何时更新的详细信息,但实际上它可以工作。
我的脚本列出了安装后添加的非依赖软件包的最新更新。
给它进行定期检查,我看到的是我手动记录的内容,没有任何遗漏。
即,出于相同原因安装了成批的数据包。不幸的是,更新破坏了该顺序。
系统升级后,我列出了升级后未更新的已添加软件包的列表,然后列出了升级后的软件包。
整齐!请享用。

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
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.