it-swarm-id.com

Menggunakan xargs dengan input dari file

Katakanlah saya punya file dengan yang berikut ini

bob
john
sue

Sekarang ini secara langsung sesuai dengan (dalam hal ini) pola URL seperti http://example.com/persons/bob.tar, john.tar, sue.tar.

Saya ingin mengambil baris ini dan menjalankannya melalui xargs. Saya tidak tahu apa yang diteruskan ke perintah yang dieksekusi sekalipun. Bagaimana cara mengakses parameter baik dari Prompt (katakan saya ingin hanya menggema setiap baris seperti cat file | xargs echo $PARAM) atau dari skrip bash.

44
Josh K

Michael jawaban benar, dan harus menyelesaikan masalah Anda. Lari

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

akan mengunduh file bob.tarjohn.tar.sue.tar seperti yang diharapkan.

[~ # ~] tetapi [~ # ~] : kucing di sini tidak berguna

lebih baik gunakan:

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

Saya pikir Anda bertanya bagaimana memasukkan setiap baris yang ditarik dari xargs 'stdin di tengah-tengah perintah, alih-alih hanya menempelkannya di ujung saja. Jika demikian, -I flag membutuhkan replacement-string argumen; xargs akan menggantikan replacement-string pada perintah dengan baris baca dari stdin:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
 $ man  xargs  
 ... 
 --arg-file = file 
 -a file 
 Baca item dari file bukannya input standar. Jika Anda menggunakan opsi 
 Ini, stdin tetap tidak berubah ketika perintah dijalankan. Lainnya - 
 Bijaksana, stdin dialihkan dari /dev/null.[.____.[...[.____]

Anda mungkin ingin mengatur --delimiter=/-d hingga '\n' demikian juga.


Di sisi lain, jika Anda hanya mencoba mengubah setiap baris dalam file menjadi URL,

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

akan dilakukan, dan jika Anda ingin mengambil semuanya, cukup sambungkan ke | wget -i.

9
ephemient

cara lain dengan perulangan Shell:

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

anda juga dapat menjalankan setiap iterasi di latar belakang dengan menambahkan & sebelum titik koma terakhir - untuk unduhan yang sangat besar ini mungkin berguna

8
Brad Clawsie

Dengan GNU Paralel dapat Anda lakukan:

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

Atau:

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

Tonton video intro untuk GNU Paralel untuk mempelajari lebih lanjut: http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

while read VAR; do ... done loop sederhana namun sangat fleksibel:

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

Ini adalah versi yang lebih umum dari jawaban Stefan: tetapi saya menggunakan awk di tengah untuk menyiapkan "string" yang tepat yang ingin saya eksekusi xargs. Dan kemudian xargs menggunakan bash untuk melakukan "pekerjaan" yang sebenarnya.

Ini sedikit berlebihan untuk contoh ini, tetapi ini adalah solusi umum yang dengan beberapa modifikasi dapat menyelesaikan banyak masalah ...

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