phu*_*ehe 57 ubuntu package-management
在 Gentoo 中有/var/lib/portage/world一个包含我明确安装的包的文件。明确我的意思是,我选择的包,不包括默认安装的任何东西,或由依赖项引入的。
是否有类似的文件或命令可以在 Ubuntu 中查找该信息?
Ste*_*n D 47
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
Run Code Online (Sandbox Code Playgroud)
考虑这个问题的一种方法是将其分为三个部分:
以下命令似乎适用于我的系统:
$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
Run Code Online (Sandbox Code Playgroud)
类似的方法可以在 Gilles 作为对该问题的评论发布的链接中找到。一些消息来源声称这仅在您使用 aptitude 安装软件包时才有效;然而,我几乎从不使用 aptitude 来安装软件包,发现这仍然有效。这--disable-columns可以防止 aptitude 用空格填充包名的行,这会妨碍下面的比较。在| sort -u排序文件,并删除重复。这使得最后一步更容易。
注意:本节从我认为是说明性的“错误路径”开始。第二段代码是有效的。
这有点棘手。我最初认为一个很好的近似值是所有依赖于元包 ubuntu-minimal、ubuntu-standard、ubuntu-desktop 和各种 linux 内核相关包的包。谷歌搜索的一些结果似乎使用了这种方法。要获取这些依赖项的列表,我首先尝试了以下操作(无效):
$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u
Run Code Online (Sandbox Code Playgroud)
这似乎遗漏了一些我知道默认情况下必须提供的软件包。我仍然相信如果构建正确的元包列表,这种方法应该有效。
但是,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
Run Code Online (Sandbox Code Playgroud)
该列表可能已经排序并且是唯一的,但我想确保它被正确排序以使下一步更容易。然后我将输出放入defaultinstalled.txt.
这是最简单的部分,因为大多数类 Unix 系统都有很多工具可以做到这一点。该comm工具是执行此操作的众多方法之一:
comm -23 currentlyinstalled.txt defaultinstalled.txt
Run Code Online (Sandbox Code Playgroud)
这应该打印第一个文件唯一的行列表。因此,它应该打印不在默认安装中的已安装软件包列表。
jmi*_*rez 26
您可以使用这两种单线中的任何一种。两者在我的机器上产生完全相同的输出,并且比迄今为止(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)
Run Code Online (Sandbox Code Playgroud)
使用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)
Run Code Online (Sandbox Code Playgroud)
极少数仍然包通过裂缝下跌,虽然我怀疑这是由用户实际安装,通过语言本地化设置或安装例如,通过编解码器图腾安装程序后,无论是正确的。此外,linux-header 版本似乎也在累积,即使我只安装了非特定于版本的元包。例子:
libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29
Run Code Online (Sandbox Code Playgroud)
它是如何工作的
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 包,而另一个文件包含。两者都列出了比上述解决方案更多的软件包。
小智 10
根据man apt-mark:
apt-mark showauto
apt-mark showmanual
Run Code Online (Sandbox Code Playgroud)
以下是一些示例输出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
Run Code Online (Sandbox Code Playgroud)
至于你的问题,用 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
Run Code Online (Sandbox Code Playgroud)
注意:
Commandline,所以这个grep技巧对他们不起作用。小智 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) \
)`
Run Code Online (Sandbox Code Playgroud)
这个oneliner使用日志过滤系统安装的包 /var/log/installer/initial-status.gz
当我找到它时,我会发布原始线程的链接,因为这个 oneliner 不是我的,而且我似乎不记得在哪里看到它了。
| 归档时间: |
|
| 查看次数: |
33209 次 |
| 最近记录: |