安装其他计算机上安装的所有最近安装的软件包。

安装其他计算机上安装的所有最近安装的软件包。

我在一台计算机上安装了一些软件包。我想为另一台计算机安装类似的软件包。

我可以使用此命令列出所有最近的包

cat /var/log/dpkg.log | grep "\ install\ "

它将输出类似

2015-02-18 19:33:46 install login:amd64 <none> 1:4.1.5.1-1ubuntu9
2015-02-18 19:33:46 install lsb-base:all <none> 4.1+Debian11ubuntu6
2015-02-18 19:33:46 install makedev:all <none> 2.3.1-93ubuntu1
2015-02-18 19:33:46 install module-init-tools:all <none> 15-0ubuntu6
2015-02-18 19:33:46 install mount:amd64 <none> 2.20.1-5.1ubuntu20
2015-02-18 19:33:46 install mountall:amd64 <none> 2.53

这个名单相当长。

我想让它变成类似

sudo apt-get install login lsb-base module-init-tools mount mountall

答案1

你不需要按照你的意愿去做,有一个更好的方法来备份程序列表:

在第一次计算时运行以下命令:

dpkg --get-selections > /some-path/packages.list

sudo cp -R /etc/apt/sources.list* /some-path/

sudo apt-key exportall > /some-path/Repo.keys

然后将这些文件复制到另一台计算机并运行这些命令来从第一台计算机安装完全相同的应用程序:

sudo apt-key add /some-path/Repo.keys

sudo cp -R /some-path/sources.list* /etc/apt/

sudo apt-get update

sudo apt-get install dselect

sudo dpkg --set-selections < /some-path/packages.list

sudo apt-get dselect-upgrade -y

答案2

将所有显示的已安装包保存/var/log/dpkg.log在一个数组中:

mapfile -t packages < <(grep -Po '.* install \K[^ ]+' /var/log/dpkg.log)

此处的数组packages将包含所有包名称。

现在您可以简单地执行以下操作:

echo "${packages[@]}"

以空格分隔的形式查看包名称。

这与命令配合得很好apt-get

sudo apt-get install --dry-run "${packages[@]}"

上述命令将扩展为:

sudo apt-get install --dry-run libntlm0:amd64 libgsasl7:amd64 ....

如果您可以ssh从新计算机访问安装了该包的计算机,则NEW可以从计算机使用:

$ mapfile -t packages < <(ssh OLD 'grep -Po ".* install \K[^ ]+" /var/log/dpkg.log'))"

OLD这将在数​​组中保存来自计算机的包名称packagesssh相应地更改参数。

现在您可以简单地执行以下操作:

$ sudo apt-get install "${packages[@]}"

答案3

执行此操作的命令是

cat /var/log/apt/history.log | grep "\ install\ " | awk '/ install / {printf "%s ",$4 }'

相关内容