it-swarm-tr.com

Bir dosyadan girdi ile xargs kullanma

Aşağıdakileri içeren bir dosyam olduğunu varsayalım

bob
john
sue

Şimdi bunlar doğrudan (bu örnekte) http://example.com/persons/bob.tar, john.tar, sue.tar Gibi URL modellerini destekliyor.

Bu satırları alıp xargs üzerinden çalıştırmak istiyorum. Yine de yürütülmekte olan komuta ne geçtiğini bilmiyorum. Parametreye İstemden (cat file | xargs echo $PARAM Gibi her satırı yankılamak istiyorum) veya bir bash komut dosyasından nasıl erişebilirim?.

44
Josh K

Michael's answer haklıdır ve sorununuzu çözmelidir. Koşu

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

dosyaları indirecek bob.tarjohn.tar.sue.tar beklenildiği gibi.

[~ # ~] ama [~ # ~] : buradaki kedi işe yaramaz

oldukça kullanın:

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

Sanırım xargs 'stdin'den alınan satırları her zaman sonuna kadar yapıştırmak yerine nasıl ekleyeceğinizi soruyorsunuz. Öyleyse, -I bayrağı bir replacement-string argüman; xargs daha sonra replacement-string komutunda stdin'den okunan satır:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
 $ man  xargs  
 ... 
 --arg dosyası = dosya 
 -a dosya 
 Öğeleri oku standart girdi yerine dosyadan. Bu 
 Seçeneğini kullanırsanız, komutlar çalıştırıldığında stdin değişmeden kalır. Diğer - 
 Bilge, stdin /dev/null.[.____. Cialis...
 'Dan yönlendirilir.

--delimiter=/-d Öğesini '\n' Olarak da ayarlamak isteyebilirsiniz.


Öte yandan, dosyadaki her satırı bir URL'ye dönüştürmeye çalışıyorsanız,

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

ve hepsini getirmek istiyorsanız, bunu | wget -i içine ekleyin.

9
ephemient

shell döngüsüyle başka bir yol:

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

her yinelemeyi & son noktalı virgülden önce - çok büyük indirmeler için bu kullanışlı olabilir

8
Brad Clawsie

GNU Paralel ile şunları yapabilirsiniz:

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

Veya:

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

Daha fazla bilgi için GNU Paralel için giriş videosunu izleyin: http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

while read VAR; do ... done loop basit ama çok yönlü:

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

Bu Stefan: s cevap daha genel bir sürümüdür ama ben xargs yürütmek istiyorum tam "dize" hazırlamak için awk ortasında kullanıyorum. Ve sonra xargs gerçek "iş" yapmak için bash kullanıyor.

Bu örnek için biraz abartılı, ancak bazı değişikliklerle birçok sorunu çözebileceği genel bir çözümdür ...

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