#!/bin/bash
# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)
# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)
# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)
# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )
for pack in $packages; do
packname=$(echo $pack | cut -f 1 -d ":")
desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
date=$(date -r /var/lib/dpkg/info/$pack.list)
echo "# $desc"
echo "# $date"
echo "sudo apt-get install $pack"
echo -e ""
done
您可以使用这两种单线中的任何一种。两者在我的机器上产生完全相同的输出,并且比到目前为止(2014 年 7 月 6 日)在这个问题中提出的所有解决方案都更精确。
使用
apt-mark
:使用
aptitude
:很少有软件包仍然存在漏洞,尽管我怀疑这些软件包实际上是由用户安装的,无论是在安装后通过语言本地化设置还是通过 Totem 编解码器安装程序。此外,linux-header 版本似乎也在积累,即使我只安装了非特定于版本的元包。例子:
它是如何工作的:
sed
删除了行尾剩余的空白。其他可能性也不起作用:
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 文件所包含的所有内容(我检查过)。
在较新版本的 apt 包中,还有 apt-mark 命令
对于 Ubuntu 16.04,请查看日志文件
/var/log/apt/history.log
。例如:
它并不完美,但它非常擅长明确我手动安装的内容。在 grep 上放一个
-B 1
以查看它何时安装。示例输出
不确定这是否会出现
aptitude
。它似乎没有从 Ubuntu Software 桌面应用程序中获取安装。要获取所有软件包的列表(未安装、用户安装或默认安装,跨所有 PPA),
apt
请使用以下方法:apt list [option]
对此有用的可能选项是:
--installed
仅显示系统上安装的软件包(大约 50,000 多个)--manual-installed
列出由命令直接或作为依赖项显式安装的包。或者,您可以这样做:
apt list --installed | grep -F \[installed\]
获取仅由用户命令及其依赖项产生的软件包列表,并获取有关它们的其他信息,例如支持的版本和体系结构(x86、x86_64、amd64、all 等)apt-mark showauto | grep -iE '^foobar$'
如果软件包是自动安装的,将输出“foobar”,否则不输出。aptitude search '!~M ~i'
将列出未自动安装的软件包。遗憾的是 aptitude 从 10.10 开始不会成为 Ubuntu 桌面默认安装的一部分。以下脚本将打印出所有未设置为自动安装并因此手动安装的软件包:
它基于 apt-mark 如何打印出自动安装的软件包。
我想提供一个 GUI 解决方案。
打开突触包管理器。
转到状态。
单击已安装(手动)。
它将给出由
apt
或手动安装的软件包列表aptitude
。不幸的是,我在自定义过滤器中找不到任何选项来确定
foobar
软件包是手动安装的还是自动安装的。如果包在Installed下但不在Installed (manual)下,那么它是自动安装的。如果包在Installed (manual)下,那么它是手动安装的。
正如一些人评论的那样, apt-mark showmanual 似乎有点错误(我将其报告为错误 727799)。当我使用它时,它实际上报告了很多甚至没有登录的东西 /var/lib/apt/extended_states (应该存储它)并且 apt-get 没有记录安装的东西/var/lib/apt/extended_states(就在 /var/lib/dpkg/status 中)。上面 txwikinger 的 python 脚本直接来自 /var/lib/apt/extended_states 但如果你今天使用它,语法可能不起作用(我的刚开始使用 Kubuntu 13.10 生成错误)。更新的语法是:
对我来说,这是一个非常简短的 5 项清单,似乎也不准确。
如果没有人使用 apr-something 命令给你一个很好的答案,你可以用困难的方式来做。Apt-get 将其信息存储在 /var/lib/apt/extended_states 中。自动安装的任何文件都将添加到该文件中。如果您手动安装此文件中已存在的包,则该包将保留在此文件中,但在第二行中显示 Auto-installed: 0。它没有被删除。
注意:正如预期的那样,如果出现文件放置更改,可能会有更好的答案。我保留我的,以防文件位置的信息有用。
在谷歌上搜索了很多之后,我设法组装了这个脚本。它对我来说没问题: