apt-getファイルからパッケージを一括インストールしますか?


36

多くのパッケージ名を含むテキストファイルがあります。

package1
package2

# comment
# installing package3 because it was needed for...
package 3

package 4

コメントを削除せずに、テキストファイル内のすべてのパッケージを一括インストールする方法を教えてください。


このソリューションは、あなたはコメントを使用することができます:monolune.com/installing-apt-packages-from-a-requirements-file
フラックス

回答:


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オプションは、標準入力ではなくファイルからアイテムを直接読み取ることに注意してください。xargsstdinが使用するためにstdinを変更せずに残さなければならないため、ファイルをパイプ処理したくありませんapt-get


xargsこれを行う正しい方法です。トリック<()はきれいです。
イヴァンアニシュチュク

1
ので、それは確かに優れたソリューションですxargsなりますが、確かARG_MAX に達していません。
phk

それはxargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install" <(" ではなく " "でなければならず、apt-getの$(オプション-yは良い考えです。

プロセス置換は、出力をawkファイル記述子にリダイレクトしxargs -aて読み取ります。だから、絶対に欲しいの<(ではなく$(。試してみてください、あなたは私の意味を見るでしょう。コマンドを無人で実行する場合で、インストールするものが正確にわかっている場合-yは、フラグを付けることをお勧めします。
6

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]-]* 一連の文字、数字、 -
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.