如何获取没有依赖项的已安装软件包列表?

如何获取没有依赖项的已安装软件包列表?

软件中心不知何故显示已安装软件包的列表很短。如何在文本文件中获取它?

我试过:

> dpkg --get-selections|wc -l
3265

> aptitude search '~i!~M'|wc -l
1181

> dpkg -l | grep ^ii | sed 's_  _\t_g' | cut -f 2|wc -l
3076

> dpkg --get-selections | grep -v deinstall|wc -l
3076

> apt-mark showmanual|wc -l
1181

我知道我安装了几十个软件包,而不是几千个。我需要列表中我选择的没有依赖项的软件包来查看它。

更新

非常感谢@kos,我最终使用该命令获得了列表:

> zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt-get install \K.*' | tr ' ' '\n' | grep -v '\-\-reinstall'|grep -v '\-\-force-yes'|grep -v '\-y'|grep -v '\-f'|sort|uniq wc -l
103

答案1

这并不能准确回答问题:它只是给出了一个命令来列出所有apt-get install曾经运行的命令,并提供了一些关于如何进一步解析列表的建议,以便获得所有apt-get install曾经运行的命令的列表(不包括 Ubiquity 运行的命令),因为这个任务的完美解决方案似乎不存在。

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*'
  • zcat /var/log/apt/history.log.*.gz:解压所有压缩apt日志/var/log/apt,将它们连接起来并打印到stdout
  • cat - /var/log/apt/history.log: 附加/var/log/apt/history.log并打印到stdout
  • grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*'Commandline: apt-get: 仅选择以 开头且包含前导和尾随空格的行install,并将选定的每一行的其余部分打印到stdout;

这将输出曾经运行的所有命令的列表apt-get install(唯一未被考虑的输出可能是提到包的apt-get-non-命令,但该包不存在(还不存在?),至少在默认存储库中不存在);installinstall

笔记:在我的安装中(Ubuntu 15.04 64 位),列出的前四个命令是 Ubiquity 在安装过程中运行的命令;为了排除这些命令,您可以将输出传输到sed

sed '1,4d'

因此最终近似Ubuntu 15.04 64 位的命令是:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*' | sed '1,4d'

答案2

apt-mark 显示手册

将为您提供所有手动安装的软件包(不包含依赖项)的列表 - 需要注意的重要一点是,它还将显示在 Ubuntu 安装期间安装了哪些软件包。

将输出写入文件:

apt-mark showmanual > somefile

实际上还有很多其他方法,例如使用此命令

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

尽管我根本不知道上述内容是如何工作的;)

按日期查看安装的软件包:

按日期使用安装的软件包使用usecat /var/log/dpkg.log | grep "\ install\ > somefile"
安装的软件包- 这个可能就是您正在寻找的。dpkgls -l /var/log/dpkg* > somefile

要查看使用 dpkg 安装的软件包:

该文件包含上述信息:/var/log/dpkg.log

答案3

这实际上比看起来要复杂得多,Ask Ubuntu 上有不少类似的问题。

我发现查看/var/log/apt/history.log该日志的旧 gzip 版本,任何通过apt-get install命令安装的东西都会被列为由该命令安装的。

所以:

grep "apt-get install" /var/log/apt/history.log

将显示当前 apt 历史记录涵盖的时间段内的所有日志。您需要查看gunzip旧日志,然后 grep 以获取所有信息。grep 命令可以全部重定向到文本文件,为您提供一个不错的列表。

这可能只适用于apt-get install安装时使用软件中心的情况。我知道软件中心是前端,apt但不确定它是否明确使用该命令。

答案4

此命令将提供手动安装的软件包列表,以及那些“自动安装”的反向依赖项已被删除的软件包(例如,如果删除 ubuntu-server 元包,它的依赖项将不再标记为自动,现在将在此列表中):

apt list --installed | grep -v automatic

换句话说,上面的列表将返回所有没有反向依赖关系或也被标记为手动安装的包。

相关内容