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?
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?
Odpowiedzi:
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.
trzawiedzie z wielobajtowymi sekwencjami końca linii (pomyśl \r\n), dlaczego nie używasz xargs?
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.
xargsupewnia się, że ARG_MAX nie zostanie osiągnięte.
xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y installnie „ <(”, ale „ $(”, a opcja -yapt-get byłaby dobrym pomysłem.
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.
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 -