我想要获得apt
或手动安装的软件包列表aptitude
,并能够查明foobar
软件包是手动安装还是自动安装。
我们如何从命令行做到这一点?
答案1
您可以使用这两个单行代码中的任意一个。 在我的计算机上,它们都产生完全相同的输出,并且比迄今为止 (2014 年 7 月 6 日) 提出的所有解决方案都更精确。
使用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)
很少有包裹仍然漏网,尽管我怀疑这些是实际上由用户安装,要么在安装后立即通过语言本地化设置安装,要么通过 Totem 编解码器安装程序安装。此外,尽管我只安装了非特定版本的元包,但 linux-header 版本似乎也会累积。示例:
libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29
它是如何工作的:
- 获取手动安装的软件包列表。对于 aptitude,附加命令
sed
会删除行末剩余的空格。 - 获取全新安装后立即安装的软件包列表。
- 比较文件,仅输出文件 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.gz
.apt-mark
不包括 xserver-xorg 包,而另一个文件则包括。
我使用了其他各种 StackExchange 帖子作为参考,但是没有一个像上述解决方案那样有效:
两者都列出了比上述解决方案更多的包。
编辑:如果你从以前的版本升级,该怎么办:
如果您已将 Ubuntu 从一个版本升级到下一个版本,则可能需要调整此过程。在这种情况下,除了当前版本的 initial-status.gz 文件外,我还会检查较新版本的清单文件(见上文)。只需添加另一个比较即可轻松完成此操作。仅使用清单文件将不起作用,因为不幸的是清单文件不包含 initial_status.gz 文件所做的所有内容(我已检查过)。
答案2
在较新版本的 apt 软件包中,还有 apt-mark 命令
apt-mark showmanual
答案3
要获取所有软件包(未安装、用户安装或默认安装、所有 PPA)的列表,apt
请使用以下方法:
apt list [option]
对此有用的可能选项是:
--installed
仅显示系统上安装的软件包(约 50,000 多个)
--manual-installed
列出已安装的软件包明确地通过命令直接安装,或者作为依赖项安装。
或者,你可以这样做:
apt list --installed | grep -F \[installed\]
获取由用户命令及其依赖项生成的软件包列表,并获取有关它们的其他信息,如支持的版本和体系结构(x86,x86_64,amd64,全部等)
答案4
apt-mark showauto | grep -iE '^foobar$'
如果该包是自动安装的,则会输出“foobar”,否则不输出任何内容。
aptitude search '!~M ~i'
将列出未自动安装的软件包。遗憾的是,从 10.10 开始,aptitude 将不再是 Ubuntu Desktop 上的默认安装的一部分。