如何查找手动安装的软件包?

Mar*_*ing 48 apt

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

这样它会给我一个列表,texlive, ...而不是texlive, texlive-dep1, textlive-dep2, ...所有的标准包都被删除了?

如果我能以某种方式找出我删除了常规安装中的哪些程序,那也太棒了!


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

Mar*_*ell 24

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

在另一台机器上复制一组包:

在系统 A 上,运行:

dpkg --get-selections | grep -v deinstall > my-selections
Run Code Online (Sandbox Code Playgroud)

my-selections文件移至系统 B。

在系统 B 上,运行:

dpkg --set-selections < my-selections
Run Code Online (Sandbox Code Playgroud)

进而:

sudo apt-get dselect-upgrade
Run Code Online (Sandbox Code Playgroud)

重要提示:如果您已经安装了来自非标准存储库和/或 PPA 的软件包,您还需要在运行升级之前将系统 A/etc/apt/sources.list的内容复制/etc/apt/sources.list.d/到系统 B。

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

dpkg --get-selections | grep deinstall
Run Code Online (Sandbox Code Playgroud)

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

  • 我想获得所有软件包的列表,但我只想拥有我明确安装的软件包的名称。所以只是“某物”而不是“普通的东西”。 (9认同)
  • 是的,虽然这很有用,但它并不能满足问题的要求。 (6认同)
  • 如果这样做,则在删除程序时将永远不会清除自动安装的依赖项。为什么人们会投票支持回答者明确表示他不想要的答案? (3认同)

小智 20

来自 superuser.com 的这个线程给出了这个解决方案:

aptitude search '?installed ?not(?automatic)'
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用。只列出已安装的所有内容,或者肯定比我明确要求的更多。 (2认同)

小智 11

如果你的 apt 日志在 /var/log/apt 中,这样的事情应该可以工作:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"
Run Code Online (Sandbox Code Playgroud)

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

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq
Run Code Online (Sandbox Code Playgroud)


rdu*_*ain 6

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

sudo apt-get install debfoster
sudo debfoster
Run Code Online (Sandbox Code Playgroud)

这将检查所有已安装的软件包并找出哪些软件包保留了其他软件包:

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:
Run Code Online (Sandbox Code Playgroud)

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

gnome-do
texlive-full
...
Run Code Online (Sandbox Code Playgroud)

我配置 debfoster 通过/etc/debfoster.conf将这个列表放在/etc/debfoster-keepers并使用etckeeper跟踪文件以保留历史记录和备份。此处答案显示了如何从以换行符分隔的文本文件安装软件包列表:

sudo apt-mark manual $(cat debfoster-keepers)
Run Code Online (Sandbox Code Playgroud)

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

尽管debfoster 的网站说 debfoster 已被弃用,以支持 aptitude,但我更喜欢 debfoster 的快速和简单配置。它让你处于你的包数据库的中间,让你清理东西,使自动手动包更加明显。

在 debfoster 提示符下键入“h”以解释您的选项。类型 ”?” 查看包装说明。该如何到这里可能是有用的。


Rub*_*una 6

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)

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


Mar*_*ing 2

我现在终于明白了:

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"
Run Code Online (Sandbox Code Playgroud)

  • 我想这只有在您只使用 aptitude 安装过软件包的情况下才有效。不过,`/var/log/apt/history.log(.N.gz)` 中也有类似的文件。 (2认同)