it-swarm.it

Utilizzo di xargs con input da un file

Di 'che ho un file con il seguente

bob
john
sue

Ora questi corrispondono direttamente al pattern URL (in questo caso) come http://example.com/persons/bob.tar, john.tar, sue.tar.

Vorrei prendere queste righe ed eseguirle attraverso xargs. Tuttavia, non so cosa viene passato al comando in esecuzione. Come posso accedere al parametro dal prompt (supponiamo che io voglia semplicemente fare eco ad ogni riga come cat file | xargs echo $PARAM) o da uno script bash.

44
Josh K

Michael risposta è giusto e dovrebbe risolvere il tuo problema. In esecuzione

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

scaricherà i file bob.tarjohn.tar.sue.tar come previsto.

[~ # ~] ma [~ # ~] : il gatto qui è inutile

piuttosto usare:

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

Penso che tu stia chiedendo come inserire le singole linee estratte da xargs 'stdin nel mezzo di un comando, invece di incollarlo sempre alla fine. In tal caso, il -I flag prende un replacement-string discussione; xargs sostituirà quindi replacement-string nel comando con la riga letta da stdin:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
 $ man  xargs  
 ... 
 --arg-file = file 
 -a file 
 Leggi articoli dal file anziché dallo standard input. Se si utilizza questa opzione 
, Stdin rimane invariato quando vengono eseguiti i comandi. Altro - 
 Saggio, lo stdin viene reindirizzato da /dev/null.[.____.[...

Potresti voler impostare --delimiter=/-d per '\n' anche.


D'altra parte, se stai solo cercando di trasformare ogni riga del file in un URL,

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

lo farà, e se vuoi recuperarli tutti, esegui il pipe in | wget -i.

9
ephemient

un altro modo con Shell looping:

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

puoi anche eseguire ogni iterazione in background aggiungendo & prima dell'ultimo punto e virgola - per download molto grandi potrebbe essere utile

8
Brad Clawsie

Con GNU Parallel puoi fare:

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

O:

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

Guarda il video introduttivo per GNU in parallelo per saperne di più: http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

while read VAR; do ... done loop è semplice ma molto versatile:

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

Questa è una versione più generale della risposta di Stefan: ma sto usando awk nel mezzo per preparare l'esatta "stringa" che vorrei eseguire xargs. E poi xargs sta usando bash per fare il vero "lavoro".

È un po 'eccessivo per questo esempio, ma è una soluzione generale che con alcune modifiche può risolvere molti problemi ...

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