ti-enxame.com

Usando xargs com entrada de um arquivo

Digamos que eu tenho um arquivo com o seguinte

bob
john
sue

Agora, esses dados são diretamente corrosivos para (neste caso) padrão de URL, como http://example.com/persons/bob.tar, john.tar, sue.tar.

Gostaria de pegar essas linhas e executá-las através de xargs. Não sei o que é passado para o comando que está sendo executado. Como faço para acessar o parâmetro no prompt (digamos que eu queira ecoar cada linha como cat file | xargs echo $PARAM) ou de um script bash.

44
Josh K

O Michael resposta está certo e deve resolver o seu problema. Corrida

cat file | xargs -I % curl http://example.com/persons/%.tar

fará o download dos arquivos bob.tarjohn.tar.sue.tar como esperado.

[~ # ~] mas [~ # ~] : o gato aqui é inútil

prefiro usar:

<file xargs -I % curl http://example.com/persons/%.tar
74
Stefan

Eu acho que você está perguntando como inserir as linhas individuais extraídas de xargs 'stdin no meio de um comando, em vez de apenas colá-lo sempre no final. Nesse caso, o -I sinalizador leva um replacement-string argumento; xargs substituirá replacement-string no comando com a linha lida em stdin:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
 $ man  xargs  
 ... 
 --arg-file = file 
 -um arquivo 
 Ler itens do arquivo em vez da entrada padrão. Se você usar esta opção 
, Stdin permanecerá inalterado quando os comandos forem executados. Outro - 
 Sábio, o stdin é redirecionado de /dev/null.[.____.✨...

Você pode definir --delimiter=/-d para '\n' também.


Por outro lado, se você está apenas tentando transformar cada linha do arquivo em um URL,

 $  sed  -e 's #. * # http: //example.com/persons/&.tar#' arquivo 

vai fazer, e se você quiser buscar todos eles, coloque isso em | wget -i.

9
ephemient

outra maneira com o loop do Shell:

for i in `cat file`; do curl -I http://foo.com/$i; done

você também pode executar cada iteração em segundo plano, anexando & antes do último ponto e vírgula - para downloads muito grandes, isso pode ser útil

8
Brad Clawsie

Com GNU Parallel, você pode fazer:

cat urls | parallel curl {} ">" {/}

Ou:

cat persons | parallel curl http://example.com/persons/{}.tar ">" {}.tar

Assista ao vídeo de introdução para GNU Parallel para saber mais: http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

while read VAR; do ... done loop é simples, mas muito versátil:

while read Word; do wget http://example.com/persons/$Word; done < file
1
musiphil

Esta é uma versão mais geral da resposta de Stefan: s, mas estou usando o awk no meio para preparar a "string" exata que eu gostaria que o xargs execute. E então o xargs está usando o bash para fazer o "trabalho" real.

É um pouco exagerado para este exemplo, mas é uma solução geral que, com algumas modificações, pode resolver muitos problemas ...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
0
Johan