问题描述
我在我的计算机上安装了一个普通的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
第四种方案
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\*