apt-get masowa instalacja pakietów z pliku?

36

Mam plik tekstowy z dużą ilością nazw pakietów.

package1
package2

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

package 4

Jak mogę masowo zainstalować wszystkie pakiety w pliku tekstowym bez usuwania komentarzy?

James Mitch
źródło
To rozwiązanie pozwala używać komentarzy: monolune.com/installing-apt-packages-from-a-requirements-file
Flux

Odpowiedzi:

44

Coś w tym stylu powinno załatwić sprawę.

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

Konstrukcja $ (coś) uruchamia polecenie coś , wstawiając jego wynik w wierszu polecenia.

Polecenie grep wyklucza każdą linię rozpoczynającą się od #, opcjonalnie dopuszczając spację przed nią. Następnie polecenie tr zastępuje znaki nowej linii spacjami.

andol
źródło
4
trzawiedzie z wielobajtowymi sekwencjami końca linii (pomyśl \r\n), dlaczego nie używasz xargs?
Ivan Anishchuk
11

Poniższe polecenie stanowi (nieznaczne) ulepszenie w stosunku do alternatywy, ponieważ sudo apt-get installnie jest wykonywane, gdy lista pakietów jest pusta.

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

Zauważ, że -aopcja odczytuje elementy bezpośrednio z pliku zamiast standardowego wejścia. Nie chcemy przesyłać pliku do pliku, xargsponieważ standardowe wejście musi pozostać niezmienione do użycia przez apt-get.

Sześć
źródło
xargsto właściwy sposób, aby to zrobić. Sztuczka z <()jest schludna.
Ivan Anishchuk
1
To rzeczywiście lepsze rozwiązanie, ponieważ xargsupewnia się, że ARG_MAX nie zostanie osiągnięte.
phk
To musi być xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y installnie „ <(”, ale „ $(”, a opcja -yapt-get byłaby dobrym pomysłem.
Podstawienie procesu przekierowuje wyjście awkdo deskryptora pliku, z którego xargs -amożna czytać. Więc zdecydowanie chcesz <(i nie $(. Po prostu spróbuj, a zobaczysz, co mam na myśli. Jeśli polecenie ma być uruchamiane bez nadzoru, a już wiesz dokładnie, co zostanie zainstalowane, to na pewno -yflagowanie jest dobrym pomysłem.
Sześć
4

Biorąc pod uwagę plik listy pakietów package.list, spróbuj:

sudo apt-get install $(awk '{print $1'} package.list)
cmcginty
źródło
0

Oto moje rozwiązanie, aby zainstalować listę pakietów, które mam do nowej instalacji:

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

W bashfunkcji:

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

grep wyjaśnienie:

  • -o zachowaj tylko część wiersza, która pasuje do wyrażenia
  • ^[^#] wszystko, co nie zaczyna się od #
  • [[:alnum]-]* ciąg liter, cyfr i -
Biggybi
źródło