it-swarm-es.tech

Usar xargs con entrada de un archivo

Digamos que tengo un archivo con lo siguiente

bob
john
sue

Ahora estos directamente corroen a (en este caso) un patrón de URL como http://example.com/persons/bob.tar, john.tar, sue.tar.

Me gustaría tomar estas líneas y ejecutarlas a través de xargs. Sin embargo, no sé qué se pasa al comando que se ejecuta. ¿Cómo accedo al parámetro desde el símbolo del sistema (digamos que simplemente quiero repetir cada línea como cat file | xargs echo $PARAM) o de un script bash.

44
Josh K

Michael respuesta es correcto, y debería resolver su problema. Corriendo

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

descargará archivos bob.tarjohn.tar.sue.tar como se esperaba.

[~ # ~] pero [~ # ~] : el gato aquí es inútil

prefiero usar:

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

Creo que está preguntando cómo insertar las líneas individuales extraídas de xargs 'stdin en el medio de un comando, en lugar de pegarlo siempre al final. Si es así, el -I flag toma un replacement-string argumento; xargs luego reemplazará replacement-string en el comando con la línea leída de stdin:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
 $ man  xargs  
 ... 
 --arg-file = file 
 -a file 
 Leer elementos desde el archivo en lugar de la entrada estándar. Si usa esta opción 
, Stdin permanece sin cambios cuando se ejecutan los comandos. Otro - 
 Sabio, stdin se redirige desde /dev/null.[.____.font>...

Es posible que desee configurar --delimiter=/-d a '\n' también.


Por otro lado, si solo está tratando de convertir cada línea del archivo en una URL,

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

servirá, y si quieres buscarlos todos, simplemente canaliza eso en | wget -i.

9
ephemient

otra forma con el bucle de Shell:

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

también puede ejecutar cada iteración en segundo plano agregando & antes del último punto y coma: para descargas muy grandes, esto puede ser útil

8
Brad Clawsie

Con GNU Paralelo puedes hacer:

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

O:

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

Mire el video de introducción para GNU Paralelo para obtener más información: http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

while read VAR; do ... done loop es simple pero muy versátil:

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

Esta es una versión más general de la respuesta de Stefan, pero estoy usando awk en el medio para preparar la "cadena" exacta que me gustaría que ejecute xargs. Y luego xargs está usando bash para hacer el "trabajo" real.

Es un poco exagerado para este ejemplo, pero es una solución general que con algunas modificaciones puede resolver muchos problemas ...

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