Answers:
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
思考此问题的一种方法是将其分为三个部分:
以下命令似乎可以在我的系统上运行:
$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
可以在Gilles发表的对该问题的评论链接中找到类似的方法。一些消息来源声称这仅在您使用aptitude安装软件包时才有效。但是,我几乎从不使用aptitude来安装软件包,并且发现这仍然有效。在--disable-columns
防止从与该会妨碍下面的比较坯料的包名称的填充线性向。在| sort -u
各种各样的文件,并删除重复项。这使最后一步容易得多。
注意:本节以“错误的路径”开始,我认为这是说明性的。第二段代码是有效的代码。
这有点棘手。最初,我认为所有与元软件包ubuntu-minimal,ubuntu-standard,ubuntu-desktop和各种linux内核相关的软件包相关的软件包都是一个很好的近似。Google搜索的一些结果似乎使用了这种方法。为了获得这些依赖关系的列表,我首先尝试了以下操作(无效):
$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u
这似乎遗漏了一些我必须默认提供的软件包。我仍然相信,如果构建正确的元软件包列表,则此方法应该可以工作。
但是,似乎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
该列表可能已经排序并且是唯一的,但是我想确保对列表进行正确排序以使下一步更容易。然后将输出放入defaultinstalled.txt
。
这是最简单的部分,因为大多数类Unix系统都有许多工具可以执行此操作。该comm
工具是执行此操作的多种方法之一:
comm -23 currentlyinstalled.txt defaultinstalled.txt
这将打印第一个文件唯一的行列表。因此,它应打印不在默认安装中的已安装软件包列表。
http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifest
了额外的| sed "s/ *$//"
骰子,但仍然没有。
apt-mark showmanual | sort -u
,如其他答案所示。更简单,并且不依赖aptitude
默认情况下未安装的哪个。
您可以使用这两个单线之一。两者在我的机器上都能产生完全相同的输出,并且比迄今为止(在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)
使用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)
只有极少数的包还是漏掉,虽然我怀疑这是真正由用户安装,或者直接通过语言本地化安装程序在安装后,或例如,通过编解码器图腾安装。另外,即使我仅安装了非特定于版本的metapackage,Linux标头版本也似乎在累积。例子:
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软件包,而另一个文件包含。两者都列出了比上述解决方案更多的软件包。
根据man apt-mark
:
apt-mark showauto
apt-mark showmanual
showmanual
显示类似的信息xserver-xorg-video-vesa
,我发誓我没有手动安装。
以下是一些示例输出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
关于您的问题,请使用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
注意:
Commandline
,所以这个grep
技巧对他们不起作用。aptitude
其他软件包管理器安装的软件包。如果您的日志已转开,那么您就不走运了。
我在搜索此查询时遇到了这个美丽的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) \
)`
此oneliner过滤系统使用以下来源的日志安装的软件包 /var/log/installer/initial-status.gz
找到链接后,我会将其发布到原始线程,因为此oneliner不是我的,而且我似乎不记得在哪里看到了它。
以下是Steven D的答案的补充。
以下行似乎在截断软件包名称,为32个字符:
aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt
这似乎可行:
aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt
看到这个答案
查看 /var/log/apt/term.log
您也可以查看文件/var/lib/apt/extended_states
。
cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'
如果您想知道旧分区上安装了什么,这将很有用。
非常感谢和祝贺那些提出脚本的宝藏!!!
我想加2美分,并增加了从$ info推导出的安装日期。
我没有掌握$ info文件为何不更新以及何时更新的详细信息,但实际上它可以工作。
我的脚本列出了安装后添加的非依赖软件包的最新更新。
给它进行定期检查,我看到的是我手动记录的内容,没有任何遗漏。
即,出于相同原因安装了成批的数据包。不幸的是,更新破坏了该顺序。
系统升级后,我列出了升级后未更新的已添加软件包的列表,然后列出了升级后的软件包。
整齐!请享用。
info='/var/lib/dpkg/info/'
comm -13 > /tmp/packages \
<(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) \
)
while read n; do
echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
| tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
aptitude search '~i!~M' -F %p
做什么?