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.
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.tar
john.tar.
sue.tar
como esperado.
[~ # ~] mas [~ # ~] : o gato aqui é inútil
prefiro usar:
<file xargs -I % curl http://example.com/persons/%.tar
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
$ 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
.
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
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
while read VAR; do ... done
loop é simples, mas muito versátil:
while read Word; do wget http://example.com/persons/$Word; done < file
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