apt-get pacchetti di installazione di massa da un file?


36

Ho un file di testo con molti nomi di pacchetti.

package1
package2

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

package 4

Come posso installare in massa tutti i pacchetti all'interno del file di testo senza rimuovere i commenti?


Questa soluzione consente di utilizzare i commenti: monolune.com/installing-apt-packages-from-a-requirements-file
Flux

Risposte:


44

Qualcosa del genere dovrebbe fare il trucco.

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

La costruzione $ (qualcosa) esegue il comando qualcosa , inserendo il suo output nella riga di comando.

Il comando grep esclude qualsiasi riga che inizia con un #, facoltativamente consentendo spazi bianchi prima di esso. Quindi il comando tr sostituisce le nuove righe con spazi.


4
trfallirà con le sequenze multi-byte di fine riga (pensa \r\n), perché non usi xargs?
Ivan Anishchuk,

11

Il seguente comando è un (leggero) miglioramento rispetto perché alternativa sudo apt-get installnon viene eseguita quando la lista pacchetto è vuota.

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

Si noti che l' -aopzione legge gli elementi direttamente da un file anziché dallo standard input. Non vogliamo reindirizzare un file xargsperché stdin deve rimanere invariato per essere utilizzato da apt-get.


xargsè il modo giusto per farlo. Il trucco con <()è pulito.
Ivan Anishchuk,

1
Questa è davvero la soluzione migliore perché si xargsassicura che ARG_MAX non sia raggiunta.
phk,

Deve essere xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install, non " <(" ma " $(" e l'opzione -yper apt-get sarebbe una buona idea.

La sostituzione del processo reindirizza l'output di awkin un descrittore di file xargs -ada cui leggere. Quindi sicuramente vuoi <(e non $(. Provalo e vedrai cosa intendo. Se il comando deve essere eseguito incustodito e sai già esattamente cosa verrà installato, sicuramente, il loro -yflag è una buona idea.
Sei

4

Dato un file dell'elenco dei pacchetti package.list, provare:

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

0

Bene, ecco la mia soluzione per installare un elenco di pacchetti che ho per una nuova installazione:

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

In una bashfunzione:

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

grep spiegazione :

  • -o mantenere solo la parte della riga corrispondente all'espressione
  • ^[^#] tutto ciò che non inizia con a #
  • [[:alnum]-]* una sequenza di lettere, numeri e -
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.