apt-get Masseninstallationspakete aus einer Datei?

36

Ich habe eine Textdatei mit vielen Paketnamen.

package1
package2

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

package 4

Wie kann ich alle Pakete in der Textdatei massenweise installieren, ohne die Kommentare zu entfernen?

James Mitch
quelle
Mit dieser Lösung können Sie Kommentare verwenden: monolune.com/installing-apt-packages-from-a-requirements-file
Flux

Antworten:

44

Etwas in diese Richtung sollte den Trick tun.

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

Die $ (something) -Konstruktion führt den something- Befehl aus und fügt seine Ausgabe in die Befehlszeile ein.

Der Befehl grep schließt alle Zeilen aus, die mit einem # beginnen, und lässt optional Leerzeichen davor zu. Dann ersetzt der Befehl tr Zeilenumbrüche durch Leerzeichen.

andol
quelle
4
trwird mit Multibyte-Zeilenende-Folgen scheitern (denken Sie \r\n), warum verwenden Sie nicht xargs?
Ivan Anishchuk
11

Der folgende Befehl ist eine (geringfügige) Verbesserung gegenüber der Alternative, da er sudo apt-get installnicht ausgeführt wird, wenn die Paketliste leer ist.

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

Beachten Sie, dass die -aOption Elemente direkt aus einer Datei anstelle der Standardeingabe liest. Wir wollen keine Datei xargseinfügen, da stdin für die Verwendung von unverändert bleiben muss apt-get.

Sechs
quelle
xargsist der richtige Weg, um dies zu tun. Trick mit <()ist ordentlich.
Ivan Anishchuk
1
Das ist in der Tat die bessere Lösung, da xargssichergestellt ARG_MAX ist, dass nicht erreicht wird.
Phk
Es muss sein xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install, nicht " <(" sondern " $(" und die Option -yfür apt-get wäre eine gute Idee.
Die Prozessersetzung leitet die Ausgabe von awkin einen Dateideskriptor um xargs -a, aus dem gelesen werden kann. Also willst du definitiv <(und nicht $(. Probieren Sie es einfach aus und Sie werden sehen, was ich meine. Wenn der Befehl unbeaufsichtigt ausgeführt werden soll und Sie bereits genau wissen, was installiert werden soll, -yist es eine gute Idee , sie zu kennzeichnen.
Sechs
4

package.listVersuchen Sie anhand einer Paketlistendatei Folgendes:

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

Nun, hier ist meine Lösung, um eine Liste der Pakete zu installieren, die ich für die Neuinstallation habe:

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

In einer bashFunktion:

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

grep Erklärung:

  • -o Behalten Sie nur den Teil der Zeile bei, der dem Ausdruck entspricht
  • ^[^#] alles was nicht mit a beginnt #
  • [[:alnum]-]* eine Folge von Buchstaben, Zahlen und -
Biggybi
quelle