我们如何通过命令行实现这个功能?
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)
libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29
它是如何工作的:
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从一个版本升级到另一个版本,您可能需要调整此过程。在这种情况下,我建议除了当前版本的初始状态.gz文件外,还要检查较新版本的清单文件(参见上文)。您可以通过添加另一个比较来轻松完成。仅使用清单文件将无法正常工作,因为不幸的是,清单文件不包含初始状态.gz文件中的所有内容(我已经检查过了)。
/var/log/installer/initial-status.gz
文件丢失了。另外,我想知道这是否取决于apt标记为“manual”还是其他原因? - Anwarshowmanual
命令(如下所示)。然后使用comm
命令比较了这两个(排序后的)列表。showmanual
的结果给出了1840个更多的独特软件包,这些软件包在通过这种方法显示的apt-mark showmanual
中没有显示出来。没有任何软件包是唯一存在于这个comm
命令的输出中的。对于我的电脑来说,有894个软件包同时出现在两个结果中,我认为这更有趣。不确定为什么会有如此巨大的差异。一些(很多?)软件包似乎是特定于某个版本的。其他像XOrg、GTK组件和lib*
之类的东西可能是更新。总之,这个答案是一个非常好的起点。 - willapt-mark showmanual
进行了比较。有趣的是,可以看到有很多差异。你的列表中有238个软件包,而showmanual返回1717个软件包。在2179个已安装的软件包中,只有223个同时出现在两个列表中,15个只出现在你的列表中(例如:nodejs,lightdm),223个只出现在showmanual中(例如:xserver-xorg,ubuntu-desktop)。感觉你的列表更有帮助,但不知道这些差异来自哪里,很难做出决定...(但我非常确定我手动安装了nginx和lightdm...)[抱歉,我刚才写了同样的内容 ;)] - Daniel Alderzenity
),2)我听说过但认为是核心功能的东西(如acpi-support
),3)对我来说完全无用的东西(如十个printer-driver-xxx
,而我甚至没有打印机),以及4)几乎肯定是由另一个应用程序而不是我安装的东西(如thunderbird-locale-en
)。 - Mark Jeronimusapt install git-review
命令时,只有 git-review
被列出。到目前为止,一切都很好。但是当我使用 apt remove git-review
命令时,git 软件包仍然存在但没有被列出。这是因为 git 是软件包 libdpkg-perl 中的一个“建议”(请参阅 /var/lib/dpkg/status)。如果一个软件包是通过 apt install --no-install recommends
命令安装的,并且后来另一个软件包安装了该建议,那么该建议将保留但不会被列出。我不知道如何解决这个问题。 - Alexander Traudgit-review
是你手动安装的软件包。而git
则不是,无论是建议还是依赖关系。 - MestreLion*-locale-*
)。它们不能被标记为自动安装,否则apt autoremove
会将它们删除,所以你的桌面环境会将它们安装为手动安装。 - MestreLion~/.bash_aliases
中的apt-list-manual
函数实现了,还按照@bmaupin的建议处理了下载的清单文件。 - MestreLiongit-review
仍然安装时,我不需要列出 git
。但是,当我移除 git-review
后,我想知道是否有剩余的软件包,例如 git
。在这种情况下,尽管它只是一个建议性的软件包,但 git
仍然被标记为已安装。有多个软件包会使 git
保持安装状态。举个例子:我使用一个应用程序,不再想使用它,并且想要删除与之相关的所有已安装内容。现在,有人可能会说这不是最初的问题。然而,在提问时可能并不知道这样的过渡情况。 - Alexander Traudgit
列为手动安装的软件包会有用。如果没有其他人建议或依赖它,apt autoremove
可以处理它。 - MestreLionmapfile -t mypackages < <(this answer); sudo apt purge "${mypackages[@]}" && sudo apt autoremove
。 - MestreLion由其他应用程序安装
... 由[我的]桌面环境安装
。是的,是由另一个应用程序(桌面环境)安装的,而不是我自己(使用apt)。 - Mark Jeronimusautoremove
在我的情况下并不适用,因为git是一个完全不同的、默认安装的软件包的建议项。因此,当任何东西作为副作用安装了git时,git会“粘”在我的系统上。因此,我的使用情况是关于那些列在“将安装以下新软件包”中的软件包:git-review git git-man liberror-perl。我认为这些是手动安装的。apt只考虑git-review是手动安装的,这是可以接受的。然而,即使我删除了git-review,git仍然保持安装状态,并且被标记为“自动”。 - Alexander Traudapt
做得很对:git-review
确实是你要安装的唯一一个软件包,其他的都是作为依赖关系/建议而自动安装的。如果将git
标记为手动安装,就意味着没有任何软件会被标记为自动安装,这样auto
/manual
的概念就完全失去了意义。git
之所以保留下来,是因为有其他人现在需要/建议它,但它仍然是一个自动安装的软件包。你从未直接请求过它。 - MestreLionautoremove
会照顾到你的情况,通过删除任何未被你直接请求的“不必要”的软件包。git
现在不再是不需要的,有其他人需要/建议它,所以autoremove
不应该将其移除。它仍然是auto
(正如它应该的那样),只有在没有其他人依赖它时,才能自动删除。 - MestreLionapt-mark showmanual
linux-image-3.11.0-*-generic
等视为手动操作。 - Daniel Alderapt-get autoremove
命令可能会删除整个系统。这绝对不是你想要的结果。 - Anton Kubuntu-minimal
和ubuntu-standard
软件包来完成这个操作,不需要将它们的任何依赖标记为手动安装。 - OrangeDogapt-mark
。 - Hinzapt install ...
命令的用户明确安装的。 - Elliott Slaughter/var/log/apt/history.log
。zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz
-B 1
可以看到它是何时安装的。Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade
aptitude
。它似乎无法从Ubuntu软件桌面应用程序中获取安装信息。comm -23 <(zgrep "Commandline: \(apt\|apt-get\) install" /var/log/apt/history.log* | sed -n 's/^Commandline: \(apt\|apt-get\) install //p' | tr " " "\n" | sort -u) <(zgrep "Commandline: \(apt\|apt-get\) \(remove\|purge\)" /var/log/apt/history.log* | sed -n 's/^Comma ndline: \(apt\|apt-get\) \(remove\|purge\) //p' | tr " " "\n" | sort -u)
- jmiserezapt-mark showauto | grep -iE '^foobar$'
命令,如果该软件包是自动安装的,则会输出 "foobar",否则不会有任何输出。
aptitude search '!~M ~i'
命令,将列出未自动安装的软件包。很遗憾,在 Ubuntu Desktop 10.10 开始,默认安装中将不再包含 aptitude 软件。
aptitude search
显示的是所有软件包,而不仅仅是手动安装的软件包(我猜这就是原帖作者想要的)。 - Oliaptitude search '!~M ~i'
命令,它列出了1043个软件包。但我绝对没有手动安装那么多软件包。 - ThatGraemeGuyaptitude search '!~M ~i'
显示了确切的1583行,比我预期的要多得多。但是apt-mark showmanual
也是如此,所以至少它们是一致的。 - Peter V. Mørch#!/usr/bin/python
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
sys
模块而使用sys.exit(1)
可能会导致错误。要么导入sys
模块,要么使用exit(1)
。 - Videonauth正如一些人所评论的,apt-mark showmanual似乎有点bug(我已经报告了错误 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刚开始生成错误)。更新后的语法如下:
#!/usr/bin/python
import sys
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
sys
模块而使用sys.exit(1)
可能会导致错误。要么导入sys
模块,要么使用exit(1)
。 - Videonauthegrep 'apt(-get)? +install' /var/log/apt/history.log
egrep 'apt(-get|itude)? +install' /var/log/apt/history.log
dpkg
安装的软件包——反正我也不怎么用。)
原因:如果虚拟机已经包含了一些由虚拟机维护者安装的默认软件(在基础镜像中),而不是由您安装的软件,那么这个答案将不会显示他们安装的软件(至少在我使用的虚拟机中不会),只会显示您安装的软件。apt-mark showmanual
或aptitude search '!~M ~i'
或apt list --manual-installed
的方法,在我的情况下,在虚拟机中显示了90%对我来说不感兴趣的软件包,这些软件包并非我安装的,而是一些虚拟机基础镜像的维护者安装的(我猜测)。history | egrep 'apt(-get|itude)? +install'
。 - VidathDapt -y install
。 - bers如果没有人用apt-某个命令给你一个好的答案,你可以选择以困难的方式来解决。Apt-get将其信息存储在/var/lib/apt/extended_states中。任何自动安装的文件都将添加到此文件中。如果你手动安装了已经在该文件中的软件包,该软件包将保留在该文件中,但在第二行中会显示Auto-installed: 0。它不会被删除。
注意:预计会出现更好的答案,如果文件位置发生变化可能会有效。我会保留我的答案,以防文件位置信息有用。
apt-get install liferea
,但它没有安装,而是输出了一些类似于“标记为手动安装”的内容。现在liferea仍然在文件中,只是下一行的数字从1
变成了0
。另外,你应该将正则表达式模式改为" foobar$"
,而不仅仅是foobar
。 - Umang