Katakanlah saya punya file dengan yang berikut ini
bob
john
sue
Sekarang ini langsung corrospond ke (dalam kasus ini) pola URL seperti http://example.com/persons/bob.tar
, john.tar
, sue.tar
.
Saya ingin mengambil garis-garis ini dan menjalankannya xargs
. Saya tidak tahu apa yang diteruskan ke perintah yang dieksekusi sekalipun. Bagaimana cara mengakses parameter baik dari prompt (katakan saya ingin cukup menggemakan setiap baris seperti cat file | xargs echo $PARAM
) atau dari skrip bash.
xargs
ia memecahnya demi baris dan memberi makan setiap baris ke dalam perintah, kan? Bagaimana saya mengaksesnya jika saya perlu mengatakan sesuatu seperticat file | xargs curl http://example.com/[PASSED FROM FILE].tar
?Jawaban:
Jawaban Michael benar, dan harus menyelesaikan masalah Anda. Lari
akan mengunduh file
bob.tar
john.tar.
sue.tar
seperti yang diharapkan.TETAPI : kucing di sini tidak berguna
lebih baik gunakan:
sumber
cat xaa xab xac xad ... xargs ...
cat
benar-benar baik-baik saja, hanya ingin menambahkan lebih banyak info ... :)xargs -I % curl …
( opsi xargs sebelumcurl
dan opsi / argumennya). Paling tidakxargs curl -I %
(di mana-I %
dimaksudkan sebagai opsi untuk xargs , bukan curl ) tidak portabel.Saya pikir Anda bertanya bagaimana memasukkan garis individual yang ditarik dari
xargs
'stdin di tengah-tengah perintah, alih-alih hanya menempelnya di ujung selalu. Jika demikian,-I
bendera tersebut mengambilreplacement-string
argumen;xargs
kemudian akan menggantikanreplacement-string
perintah dengan baris read dari stdin:sumber
curl http://example.com/foobar.tar > foobar.tar
?>
adalah konstruksi shell, dan tidak akan bekerja untukxargs
. Di sisi lain,curl -o
akan menulis ke file bernama bukan stdout, seperti apawget
, jadi mungkin itu yang ingin Anda gunakan di sini.Anda mungkin ingin set
--delimiter=
/-d
untuk'\n'
juga.Di sisi lain, jika Anda hanya mencoba mengubah setiap baris dalam file menjadi URL,
akan dilakukan, dan jika Anda ingin mengambil semuanya, cukup masukkan saja .
| wget -i
sumber
cara lain dengan perulangan shell:
Anda juga dapat menjalankan setiap iterasi di latar belakang dengan menambahkan
&
sebelum titik koma terakhir - untuk unduhan yang sangat besar ini mungkin bergunasumber
while IFS= read i ; do curl ... ; done < file
Dengan GNU Parallel Anda dapat melakukan:
Atau:
Tonton video intro untuk GNU Parallel untuk mempelajari lebih lanjut: http://www.youtube.com/watch?v=OpaiGYxkSuQ
sumber
while read VAR; do ... done
loop sederhana namun sangat fleksibel:sumber
Ini adalah versi yang lebih umum dari jawaban Stefan: tetapi saya menggunakan awk di tengah untuk menyiapkan "string" yang tepat yang ingin saya jalankan xargs. Dan kemudian xargs menggunakan bash untuk melakukan "pekerjaan" yang sebenarnya.
Ini agak berlebihan untuk contoh ini, tetapi ini adalah solusi umum yang dengan beberapa modifikasi dapat menyelesaikan banyak masalah ...
sumber