Digamos que tengo un archivo con lo siguiente
bob
john
sue
Ahora bien, estos directamente a corrospond (en este caso) patrón de URL como http://example.com/persons/bob.tar
, john.tar
, sue.tar
.
Me gustaría tomar estas líneas y recorrerlas xargs
. Sin embargo, no sé qué se pasa al comando que se ejecuta. ¿Cómo accedo al parámetro desde el indicador (por ejemplo, quiero hacer eco de cada línea cat file | xargs echo $PARAM
) o desde un script bash?
xargs
, la divide por línea y alimenta cada línea en un comando, ¿verdad? ¿Cómo accedo a eso si necesito decir algo comocat file | xargs curl http://example.com/[PASSED FROM FILE].tar
?Respuestas:
La respuesta de Michael es correcta, y debería resolver su problema. Corriendo
descargará los archivos
bob.tar
john.tar.
sue.tar
como se esperaba.PERO : el gato aquí es inútil
prefiero usar:
fuente
cat xaa xab xac xad ... xargs ...
cat
está bien, solo quiero agregar más información ... :)xargs -I % curl …
( opción xargs antescurl
y sus opciones / argumentos). Por lo menosxargs curl -I %
(donde-I %
se entiende como una opción para xargs , no curl ) no es portátil.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í, la-I
bandera toma unreplacement-string
argumento;xargs
luego reemplazaráreplacement-string
en el comando con la línea leída de stdin:fuente
curl http://example.com/foobar.tar > foobar.tar
?>
es una construcción de shell, y no funcionaráxargs
. Por otro lado,curl -o
escribirá en un archivo con nombre en lugar de stdout, como lo quewget
hace, por lo que probablemente sea lo que le gustaría usar aquí.Es posible que desee establecer
--delimiter=
/-d
a'\n'
también.Por otro lado, si solo está tratando de convertir cada línea del archivo en una URL,
servirá, y si quieres buscarlos todos, simplemente mételos .
| wget -i
fuente
Otra forma con el bucle de shell:
también puede ejecutar cada iteración en segundo plano agregando
&
antes del último punto y coma; para descargas muy grandes, esto podría ser útilfuente
while IFS= read i ; do curl ... ; done < file
Con GNU Parallel puedes hacer:
O:
Mire el video de introducción de GNU Parallel para obtener más información: http://www.youtube.com/watch?v=OpaiGYxkSuQ
fuente
while read VAR; do ... done
El bucle es simple pero muy versátil:fuente
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 ejecutara 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 ...
fuente