查找所有用户安装的软件包


38

有什么方法可以获取Ubuntu系统上所有用户安装的软件包的列表,即已安装在默认安装软件包之上的软件包吗?

(这个想法是获得一个完整的列表,可用于在干净的Ubuntu安装中安装相同的软件包)

Answers:


15

看这些文件

  1. ' /var/log/installer/initial-status.gz'-您的主要安装
    • 该文件日期将是您的安装日期(我认为)
    • ' /var/log/dpkg.log'更新时间表(这就是您想要的)
    • ' /var/log/apt/term.log'- apt系统中的事物已更新
    • ' /var/cache/apt/archives/'将包含deb下载用于安装的软件包

更新:使用以下两个步骤获取新安装的确切列表:

  1. 执行: grep -w install /var/log/dpkg.log > full-list.log
  2. 查看/var/log/installer/initial-status.gz时间戳之外的行

由于您希望使用这些软件包在另一个系统上进行全新安装,因此您甚至可以将“ deb”文件从“ cache / apt / archives”路径复制到新安装的文件中,并一口气安装它们(无需下载)他们)。


谢谢你的提示。这很有用,尽管我一直在寻找单个命令来获取此列表。cat /var/log/dpkg.log | 如果我忽略在安装日期/时间之前安装的项目,则
grep'install

添加不赞成投票的理由将有助于理解答案中的问题(如果有的话)。将来也会带来更好的答案。
NIK

哎呀,那票选票是我的意外。我已经赞成你的回答。当我尝试将您的答案标记为“最终”时,我单击了误击并按下了向下箭头。尝试撤消操作时,显示以下消息:“投票太老,无法更改,除非已编辑此答案。” 对不起,尼克,无论是对否决票还是困惑。:-(
Rabarberski

@Rabarberski,好吧……没有伤害。
NIK

如果/ var / log / installer不存在,则不起作用,例如在服务器上安装。如果您谈论的是“ Ubuntu”,那么添加版本号也很有意义-哪个Ubuntu?

8

仅出于笑容,我整理了一个单线(为清晰起见,在此拆分),找出手动安装的软件包,不包括最初安装的软件包和自动安装的所有软件包:

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


这几乎可以完美地工作,只是它看起来可以打印出在初始安装过程中安装的一堆库。有一堆libtifflibxcb等我没有安装自己。这个答案:superuser.com/a/105000/24349通过根据安装时间进行排序并在系统安装时间之前删除所有内容来解决此问题。严重使用外壳!
haxney

3

基于上述信息,我编写了一个简短的Python脚本来列出手动安装的软件包。请参阅此链接

尽管我不承担任何责任,但请随时使用它。但是,总是欢迎您提供反馈和建议。


辉煌!它需要一段时间才能运行,但这是我找到的唯一可以完全满足我需要的解决方案!
haxney 2012年

2
不幸的是,该链接现在已断开(显示python追溯),这表明了将答案放在此处的价值(尤其是对于“简短的python脚本”而言)
David Ljung Madison Stellar

使用脚本找到了一个github存储库: github.com/gerjantd/bin/blob/master / ... 单击“原始”下载,并使用“ python list_manually_installed_pa​​ckages.py”运行
David Ljung Madison Stellar,

2
github链接现在也断开了
Suzana 2015年


1

假设您具有一致的历史记录并使用能力:

history | grep -e "^..... aptitude install"

只会列出您使用aptitude install ... duh安装的软件包


1

这是一个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/[>] //'

1

谢谢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

0

实现此目的的另一种方法是根据您的“任务”确定已安装的程序,这些“任务”根据您的初始需求确定要安装的基本软件包。

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.