Answers:
看这些文件
/var/log/installer/initial-status.gz
'-您的主要安装
/var/log/dpkg.log
'更新时间表(这就是您想要的)/var/log/apt/term.log
'- apt
系统中的事物已更新/var/cache/apt/archives/'
将包含deb
下载用于安装的软件包更新:使用以下两个步骤获取新安装的确切列表:
grep -w install /var/log/dpkg.log > full-list.log
/var/log/installer/initial-status.gz
时间戳之外的行由于您希望使用这些软件包在另一个系统上进行全新安装,因此您甚至可以将“ deb”文件从“ cache / apt / archives”路径复制到新安装的文件中,并一口气安装它们(无需下载)他们)。
仅出于笑容,我整理了一个单线(为清晰起见,在此拆分),找出手动安装的软件包,不包括最初安装的软件包和自动安装的所有软件包:
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) \
)
这适用于bash
和中zsh
。
libtiff
,libxcb
等我没有安装自己。这个答案:superuser.com/a/105000/24349通过根据安装时间进行排序并在系统安装时间之前删除所有内容来解决此问题。严重使用外壳!
基于上述信息,我编写了一个简短的Python脚本来列出手动安装的软件包。请参阅此链接。
尽管我不承担任何责任,但请随时使用它。但是,总是欢迎您提供反馈和建议。
在这里查看有关一个相关问题的答案:如何显示Debian系统上安装的所有软件包的列表?。该问题上的其他一些答案也包含有关获取此类列表的不错建议。
该问题应标记为重复,因为先前的问题也涵盖了该问题,但是使该问题独立存在可能会很有用,因此更容易查找。
这是一个hack-job,但完全可以。
首先,转到http://releases.ubuntu.com/maverick/(或您使用的任何版本的Ubuntu),然后获取*.manifest file
与您使用的Ubuntu版本相关联的。
然后,运行以下脚本(包括<manifest file>
,尖括号和所有内容,以及已下载文件的路径。您始终可以附加> output
到末尾以进行文件转储。
diff --suppress-common-lines <(sed 's/ .*//' <manifest file>) <(dpkg --get-selections | sed 's/[ \t].*//') | grep '>' | sed 's/[>] //'
谢谢geekosaur,好的代码。我使用了它,但是花了一段时间才弄清楚如何使其工作。这是我在Ubuntu 11.10中完成的操作-它可在bash终端中运行:
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) \
) > user-installed-packages
然后添加一个标签\t
-和- install
在每一行上:
sed 's/$/\tinstall/' user-installed-packages >uip
然后在新机器上:
sudo dpkg --set-selections < uip
并安装软件包:
sudo apt-get dselect-upgrade
实现此目的的另一种方法是根据您的“任务”确定已安装的程序,这些“任务”根据您的初始需求确定要安装的基本软件包。
tasksel --list-tasks
至少你会有server
。但是,您可以选择更多。对于已安装的每个任务,您都可以获取已安装的软件包的列表,以下命令针对我在安装中选择的那些命令在一行中(为了清楚起见,将其分解):
(tasksel --task-packages server ; \
tasksel --task-packages openssh-server ; \
tasksel --task-packages lamp-server) | sort | uniq
上面的通用方法是:
(for a in $( tasksel --list-tasks | grep "^i" | awk '{ print $2 }' ) ; \
do tasksel --task-packages $a; done) | sort | uniq
现在使用apt-cache depends --installed -i --recurse <packagename> | grep -v "^ "
来获取任务中定义的所有软件包所使用的依赖项列表。可以如下一行完成
apt-cache depends --installed -i --recurse \
$(for a in $( tasksel --list-tasks | \
grep "^i" | \
awk '{ print $2 }' ) ; \
do tasksel --task-packages $a; done) | grep -v "^ " | sort | uniq
以下列出了系统中安装的所有软件包(不包括依赖项)。
dpkg --get-selections | grep "[[:space:]]install" | awk '{print $1}'
现在,使用comm
命令查找仅在第二个列表中的文件(即,忽略两个文件中以及仅第一个文件中的文件)
comm -13 <(apt-cache depends --installed -i --recurse \
$(for a in $( tasksel --list-tasks | \
grep "^i" | \
awk '{ print $2 }' ) ; \
do tasksel --task-packages $a; done) | grep -v "^ " | sort ) \
<( dpkg --get-selections | grep "[[:space:]]install" | \
awk '{print $1}' | sort)