当前位置: 首页>>技术问答>>正文


如何找到手动安装的包?

,

问题描述

我在我的计算机上安装了一个普通的Ubuntu 10.10,并通过apt-get安装了一些软件。上周我设法打破了一切,从头开始,我需要重新安装我的软件。有没有办法创建一个包含我手动安装的所有软件包的列表?

那么它会给我一个像texlive, ...而不是texlive, texlive-dep1, textlive-dep2, ...的列表,并删除所有标准包?

如果我能够以某种方式找出我已经删除的常规安装中的哪些程序,那也将是非常棒的!


更新2015-05-23:我现在在我的系统上使用Ansible作为配置管理。在那里我指定要安装的包。这符合目标,在新系统上安装所有程序,甚至更好。所以这个问题可能是进入一些轻量级配置管理的问题。

最佳解决方案

有了这个建议,我假设您的旧安装仍然会启动!

要在另一台计算机上复制一组软件包:

在系统A上,运行:

dpkg --get-selections | grep -v deinstall > my-selections

my-selections文件移到系统B.

在系统B上,运行:

dpkg --set-selections < my-selections

然后:

sudo apt-get dselect-upgrade

重要提示:如果您已经从non-standard库和/或购电协议安装的软件包,你还会要你运行升级前复制/etc/apt/sources.list/etc/apt/sources.list.d/从系统A到系统B的内容。

您可以使用dpkg来查看您已删除的内容(注意:这还包括您手动安装和删除的软件包):

dpkg --get-selections | grep deinstall

您可以在终端中查看结果,当然还可以重定向到文件。

次佳解决方案

来自superuser.com的这个thread提供了这个解决方案:

aptitude search '?installed ?not(?automatic)'

第三种解决方案

如果你的apt日志在/var /log /apt中,那么这样的东西应该有效:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

或者如果你想摆脱输出中的一些重复垃圾:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq

第四种方案

你可以使用apt-mark,但我推荐debfoster

sudo apt-get install debfoster
sudo debfoster

这将检查所有已安装的软件包,并确定哪些软件包正在安装其他软件包:

texlive-full is keeping the following 161 packages installed:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Keep texlive-full? [Ynpsiuqx?], [H]elp:

当你回答每个问题的”y”时(只需按Enter键快速移动),debfoster将收集包列表并将它们写入文件line-by-line。默认情况下,这是在/var/lib/debfoster/keepers。它看起来像这样:

gnome-do
texlive-full
...

我通过/etc/debfoster.conf配置debfoster将此列表放在/etc/debfoster-keepers并使用etckeeper跟踪该文件以保留历史记录和备份。 answer here显示如何从newline-delimited文本文件安装包列表:

sudo apt-mark manual $(cat debfoster-keepers)

请注意这里的限制,您清除的软件包前面有一个’-‘。所以你想在调用apt-mark之前删除这些行。

即使debfoster’s website说debfoster被弃用而不赞成aptitude,我更喜欢debfoster的快速和简单的配置。它将您置于包数据库的中间,让您清理,使自动和手动包更加明显。

在debfoster提示符下键入”h”以解释您的选项。键入”?”以查看包描述。 how-to here可能很有用。

第五种方案

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

提供所有手动安装的软件包(不是系统软件包,不是依赖项)。例如,它显示build-essential但不显示gcc

第六种方案

我终于明白了:

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print $2; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print $2; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"

第七种方案

我可以通过打开/var /log /apt /中的日志文件来提取所有内容

然后我进入并手动过滤出apt-get安装包。可能有一种方法以编程方式执行此操作,但我不知道它。

第八种方案

对于那些喜欢使用apt- *工具的人,有一个apt-mark实用程序,它允许查询和修改手动/自动状态。

apt-mark showmanual

您还可以为感兴趣的包指定模式:

apt-mark showmanual qemu\*

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1600.html,未经允许,请勿转载。