drg*_*rog 7 package-management
如何找出自安装操作系统以来安装了哪些软件包?我不想知道所有安装的包,只知道那些不是初始操作系统安装的一部分,并且后来被明确安装的包。
为了这个问题,让我们假设全新安装,因为我认为发行版升级会使问题复杂化。我更喜欢使用命令行,但如果命令或脚本不可用,GUI 解决方案也可以。
我快速浏览了dpkgand的手册页aptitude,但没有看到任何明显的内容。此外,apt-cache show package-nameor的输出dpkg -s pkg-name似乎没有提供任何可以与操作系统安装日期进行比较的日期(我也必须弄清楚如何获得)。
我logwatch在一台服务器上每天发送已安装的通知。我的猜测是它解析 dpkg.log。我不确定这种方法是否是一种解决方案,因为许多安装条目可能已被注销,尤其是在较旧的系统上。理想情况下,这应该适用于任何系统、桌面或服务器。
如果输出可以包含当前安装的包的版本也很好,但这可能要求太多,一旦我有了包名,我总是可以稍后编写脚本。
所有 Ubuntu ISO ([UKLX]buntu/Ubuntu-gnome) 都附带.manifest包含 ISO 中所有预安装软件包列表的文件。您可以在与任何 Ubuntu ISO 镜像上的 ISO 相同的下载目录中找到这些清单文件。以可用的 Ubuntu 版本列表为例;Trusty例如,如果您有64 位,清单链接将是
http://releases.ubuntu.com/trusty/ubuntu-14.04.2-desktop-amd64.manifest。
因此,一旦您拥有此文件,只需使用comm命令将其中的软件包列表与 Ubuntu 中所有已安装软件包的列表进行比较
$ curl -O http://releases.ubuntu.com/trusty/ubuntu-14.04-desktop-amd64.manifest
$ comm -23 <( dpkg --get-selections | awk '$2 ~ /^(install|hold)/ { print $1 }' | sort ) \
<( awk '{ print $1 }' ubuntu-14.04-desktop-amd64.manifest | sort )
Run Code Online (Sandbox Code Playgroud)
为了解释comm它的作用,它需要来自 2 个文件的输入 - 第一个提供所有当前安装的包的列表,第二个提供清单文件。该-3选择禁止显示线,这两个文件都和-2禁止显示行,只有第二个文件(清单文件,这是)有。因此,最终您的输出仅包含只有一个文件具有的行,并且为您提供了自安装操作系统以来手动安装的软件包。
所以你有它。
编辑
如果你也想看看包的版本旁边的包名称在输出中,作为Slyvain皮诺指出,管道comm命令上面xargs dpkg-query -W -f='${binary:Package} ${Version}\n',使其成为
$ comm -23 <( dpkg --get-selections | awk '$2 ~ /^(install|hold)/ { print $1 }' | sort ) \
<( awk '{ print $1 }' ubuntu-14.04-desktop-amd64.manifest | sort ) | \
xargs dpkg-query -W -f='${binary:Package} ${Version}\n
Run Code Online (Sandbox Code Playgroud)
或者,awk完全地,这也给出与上述命令相同的结果
awk 'FNR==NR {arr[$1];next} !($1 in arr) { print $0 }' ubuntu-14.04-desktop-amd64.manifest <( dpkg-query -W -f='${binary:Package} ${Version}\n' )
Run Code Online (Sandbox Code Playgroud)
有关awk cmd 如何工作的说明,请参阅此链接
| 归档时间: |
|
| 查看次数: |
5663 次 |
| 最近记录: |