apt-get masowa instalacja pakietów z pliku?


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.


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.


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)

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 -
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.