apt list --installed
我有一个包含另一台机器的输出的文件。
IE
accountsservice-ubuntu-schemas/focal,focal,now 0.0.7+17.10.20170922-0ubuntu1 all [installed,automatic]
accountsservice/focal-updates,focal-security,now 0.6.55-0ubuntu12~20.04.5 amd64 [installed,automatic]
acl/focal,now 2.2.53-6 amd64 [installed,automatic]
...等等。
是否有一种简单的方法可以使用上述文件和命令行来安装这些包?
答案1
您可以提取第一部分之前的部分/
,然后使用它通过xargs
以下方式安装apt
:
xargs -a <(awk -F/ '{print $1}' some-file) apt install
或者:
awk -F/ '{print $1}' some-file | xargs apt install -y
答案2
APT 明确指出其设计目的并非与脚本一起使用:
脚本使用及与其他 APT 工具的区别
这易于(8) 命令行被设计为最终用户工具,其行为可能会因版本不同而有所变化。虽然它试图不破坏向后兼容性,但如果更改似乎有利于交互使用,则也无法保证这一点。所有功能易于(8)有专门的 APT 工具可用,例如apt-get(8)以及apt-缓存(8)同样。 易于(8)只是改变了一些选项的默认值(见apt.conf(5)特别是二进制范围)。因此,您应该优先在脚本中使用这些命令(可能启用一些附加选项),因为它们尽可能保持向后兼容性。
您使用了错误的工具。更好的方法是使用dpkg
它本身:
dpkg -l | awk '$1 == "ii" {print $2}' > installed
sudo apt-get install $(cat installed)
细节:
顺便说一句,这种方法看起来很狭隘(就像在这本很棒的指南中一样关于社区)。您将丢失大量信息 - 软件包来源及其 GPG 密钥。
此外,如果第一次出现本地安装的软件包或从第二台机器上不存在的某些 PPA 安装的软件包,此方法将失败。
如果你想要全包服务 - 试试我的python 脚本命名srslsud
(Ubuntu 和 Debian 的保存/恢复软件列表脚本)。
它将保存所有 APT 存储库、它们的 GPG 密钥;Snap、Flatpaks 和 Ubuntu Make 应用程序列表到第一台机器的 JSON 文件中。
然后,您可以在第二台机器上使用相同的 JSON 文件恢复此列表。
答案3
事实上,我最近在自己的机器上写了一个脚本,其核心就是这样做的。我首先通过管道将sed 's/\/.*//g'
斜线后面的所有内容删除。然后将输出通过管道传输到xargs /usr/bin/sudo apt install
。
正如@N0rbert 在其解决方案中提到的那样,这里的主要缺点是,只需一个错误情况(例如缺少 repo sources.list
)即可停止整个操作。因此,如果您使用的源文件与生成输入的系统不同,则您采用的解决方案将需要首先检查 pkg 是否可用于您的系统。通常,您的选择将取决于您的预期用例。
例如,您可能无需通过管道传递sed
,但在我的例子中,脚本使用 tee 将列表保存到文件中,然后使用该文件作为输入进行进一步处理。事实上,列表本身是该脚本以及与其协同工作的几个其他脚本的中心主题。
几点注意事项:您无需担心检查软件包是否已安装在您的机器上。如果已安装,apt 将直接跳过此步骤。此外,由于您在运行时很可能要安装相当多的软件包,因此最好先使用该sudo apt update && sudo apt upgrade
命令。这样可以避免下载一堆软件包,而最终在稍后为其中许多软件包下载略微更新的版本。