apt-get从文件中批量安装软件包?


Answers:


44

遵循这些思路的事情应该可以解决问题。

apt-get install $(grep -vE "^\s*#" filename  | tr "\n" " ")

$(something)构造运行something命令,并将其输出插入命令行。

grep命令将排除以#开头的任何行,可以选择在其前允许空白。然后,tr命令用空格替换换行符。


4
tr会因多字节行尾序列而失败(请思考\r\n),为什么不使用xargs
伊万·阿尼舒克

11

以下命令是对替代方法的(轻微)改进,因为sudo apt-get install在软件包列表为空时不执行。

xargs -a <(awk '! /^ *(#|$)/' "$packagelist") -r -- sudo apt-get install

请注意,该-a选项直接从文件而不是标准输入中读取项目。我们不希望将文件传输到其中,xargs因为stdin必须保持不变,以供使用apt-get


xargs是正确的方法。绝妙的把戏<()
伊万·阿尼舒克

1
这确实是更好的解决方案,因为xargs可以确保ARG_MAX 未达到目标。
phk

它必须是xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install,而不是“ <(”而是“ $(”,-y而apt-get 的选项将是一个好主意。

进程替换会将的输出重定向awk到文件描述符中xargs -a以供读取。所以你一定要<(而不要$(。尝试一下,您就会明白我的意思。如果命令将在无人值守的情况下运行,并且您已经确切知道将要安装的内容,那么可以肯定,将其-y标记为一个好主意。

4

给定软件包列表文件package.list,请尝试:

sudo apt-get install $(awk '{print $1'} package.list)

0

好吧,这是我的解决方案,用于安装全新安装的软件包列表:

sudo apt install -y $(grep -o ^[^#][[:alnum:]-]* "filename")

bash功能上:

aptif () {
    sudo apt install -y $(grep -o ^[^#][[:alnum:]-]* "$1")
}

grep 说明:

  • -o 仅保留与表达式匹配的那部分
  • ^[^#] 任何不以 #
  • [[:alnum]-]* 字母,数字和 -
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.