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?
Respostas:
Algo nesse sentido deve resolver o problema.
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.
fonte
tr
falhará com sequências de fim de linha de vários bytes (pense\r\n
), por que você não usaxargs
?O comando a seguir é uma (leve) melhoria em relação à alternativa, porque
sudo apt-get install
não é executado quando a lista de pacotes está vazia.Observe que a
-a
opção lê itens diretamente de um arquivo em vez da entrada padrão. Não queremos canalizar um arquivoxargs
porque o stdin deve permanecer inalterado para usoapt-get
.fonte
xargs
é o caminho certo para fazer isso. Truque com<()
é arrumado.xargs
garante queARG_MAX
não seja alcançada.xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install
, não "<(
" mas "$(
" e a opção-y
para o apt-get seria uma boa idéia.awk
para um descritor de arquivo paraxargs -a
leitura. 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-y
sinalizam é uma boa idéia.Dado um arquivo de lista de pacotes
package.list
, tente:fonte
Bem, aqui está a minha solução para instalar uma lista de pacotes que tenho para uma nova instalação:
Em uma
bash
função: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-
fonte