apt-get pacotes de instalação em massa de um arquivo?

36

Eu tenho um arquivo de texto com muitos nomes de pacotes.

package1
package2

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

package 4

Como posso instalar em massa todos os pacotes dentro do arquivo de texto sem remover os comentários?

James Mitch
fonte
Esta solução permite que você use comentários: monolune.com/installing-apt-packages-from-a-requirements-file
Flux

Respostas:

44

Algo nesse sentido deve resolver o problema.

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

A construção $ (something) executa o comando something , inserindo sua saída na linha de comando.

O comando grep excluirá qualquer linha que comece com um #, opcionalmente permitindo espaço em branco antes dele. Em seguida, o comando tr substitui novas linhas por espaços.

andol
fonte
4
trfalhará com sequências de fim de linha de vários bytes (pense \r\n), por que você não usa xargs?
Ivan Anishchuk 17/02
11

O comando a seguir é uma (leve) melhoria em relação à alternativa, porque sudo apt-get installnão é executado quando a lista de pacotes está vazia.

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

Observe que a -aopção lê itens diretamente de um arquivo em vez da entrada padrão. Não queremos canalizar um arquivo xargsporque o stdin deve permanecer inalterado para uso apt-get.

Seis
fonte
xargsé o caminho certo para fazer isso. Truque com <()é arrumado.
Ivan Anishchuk 17/02
11
Essa é realmente a melhor solução, porque xargsgarante que ARG_MAX não seja alcançada.
Ph16
Tem que ser xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install, não "<( " mas " $(" e a opção -ypara o apt-get seria uma boa idéia.
A substituição de processo redireciona a saída de awkpara um descritor de arquivo para xargs -aleitura. Então você definitivamente quer <(e não $(. Apenas tente e você verá o que quero dizer. Se o comando estiver em execução autônoma e você já souber exatamente o que será instalado, com certeza, eles -ysinalizam é ​​uma boa idéia.
6
4

Dado um arquivo de lista de pacotes package.list, tente:

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

Bem, aqui está a minha solução para instalar uma lista de pacotes que tenho para uma nova instalação:

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

Em uma bashfunção:

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

grep explicação:

  • -o mantenha apenas a parte da linha que corresponde à expressão
  • ^[^#] qualquer coisa que não comece com um #
  • [[:alnum]-]* uma sequência de letras, números e -
Biggybi
fonte