Bir dosyadan girdi içeren xargs kullanmak


41

Diyelim ki aşağıdakileri içeren bir dosyam var

bob
john
sue

Şimdi bunlar doğrudan gibi URL kalıbı (bu durumda) için corrospond http://example.com/persons/bob.tar, john.tar, sue.tar.

Bu çizgileri alıp koşmak istiyorum xargs. Yine de yürütülmekte olan komuta ne iletildiğini bilmiyorum. Parametreye istemden (her satırdaki gibi eko yapmak istediğimi söyleyin cat file | xargs echo $PARAM) veya bir bash komut dosyasından nasıl erişebilirim ?


Soruyu tam olarak takip etmiyorum, üzgünüm. Özellikle de, "gerçekte idam edilen komuta ne iletildiğini bilmiyorum" ne anlama geldiğinden emin değilim
Michael Mrozek

1
@Michael: Bir liste boyunca çalıştırdığınızda xargs, satır satırları ayırır ve her satırı bir komuta besler, değil mi? Gibi bir şey söylemem gerekirse buna nasıl erişebilirim cat file | xargs curl http://example.com/[PASSED FROM FILE].tar?
Josh K,

Yanıtlar:


69

Michael'ın cevabı doğru ve probleminizi çözmeliyiz. Koşu

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

bob.tar john.tar. sue.tarbeklendiği gibi dosyaları indirir .

AMA : kedi burada işe yaramaz

daha çok kullanmak:

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

1
Bir dosya örneğimde bu ideal olmayabilir, ancakcat xaa xab xac xad ... xargs ...
Josh K

10
@Josh Bazı nedenlerden dolayı insanlar burada kedinin gereksiz yere kullanılmasını çok ciddiye alırlar; Şimdi iki kez reddedildi
Michael Mrozek

2
kayıt için, benden +1 aldın. Kullanmanın catgerçekten iyi olduğunu düşünüyorum , daha fazla bilgi eklemek isterim ... :)
Stefan

Şüphesiz olması gerekir xargs -I % curl …( önce xargs seçeneği curlve seçenekleri / argümanları). En azından xargs curl -I %( kıvrılma değil xargs-I % için bir seçenek olarak kastedilir ) taşınabilir değildir.
Chris Johnsen,

@ Chris, güzel yakalama, tnx. sabit.
Stefan,

16

Sanırım xargs'stdin' komut satırının ortasına, her zaman sonuna yapıştırmak yerine tek tek satırları nasıl yerleştireceğinizi soruyorsunuz . Eğer öyleyse, -Ibayrak bir replacement-stringargüman alır ; komutta stdin'den okunan satırla xargsdeğiştirilecektir replacement-string:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar

Tamam, peki curl http://example.com/foobar.tar > foobar.tar?
Josh K,

2
@Josh K: >Bir kabuk yapılarıdır ve işe yaramaz xargs. Öte yandan, curl -ostdout yerine adlandırılmış bir dosyaya yazacak, ne wgetolduğu gibi , bu yüzden muhtemelen burada kullanmak istediğiniz şey.
efemient

9
$ man xargs
...
       --arg-file = dosya
       -bir dosya
              Standart giriş yerine dosyadaki öğeleri okuyun. Eğer bunu kullanırsan
              seçeneği, komutlar çalıştırıldığında stdin değişmeden kalır. Diğer-
              bilge, stdin / dev / null dizinine yönlendirilir.
...

Siz de ayarlamak --delimiter=/ -dyapmak isteyebilirsiniz '\n'.


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

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

yapacağım ve hepsini getirmek istiyorsanız, sadece içine pipo .| wget -i


8

Kabuk döngü ile başka bir yol:

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

Son yinelemeden &önce ekleyerek her yinelemeyi arka planda da çalıştırabilirsiniz - çok büyük indirmeler için bu kullanışlı olabilir


2
Sen ettik klasik hatalardan biri için düşmüş ! : - <link kırık, burada önbelleğe alınmış bir sürümü Kedi Ödülü Yararsız Kullanımı .
Sorpigal

@ Sorpigal Bu url bozuldu. 'Klasik Blunder' nedir?
starbeamrainbowlabs 13:15

@starbeamrainbowlabs - kedinin işe yaramaz kullanımı, yukarıdaki yorumda bu bağlantının önbelleğe alınmış bir sürümünü koydum.
slm

@starbeamrainbowlabs: Özellikle Tehlikeli Backticks'le bağlantı kurdum , ancak bir süre sonra yapı değiştirirseniz kedinin kullanımı da gereksizdir:while IFS= read i ; do curl ... ; done < file
Sorpigal


1

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

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

0

Bu Stefan'ın cevabının daha genel bir versiyonudur: ancak xargs'ın çalıştırmasını istediğim tam dizgiyi hazırlamak için ortada awk kullanıyorum. Ve sonra xargs asıl "işi" yapmak için bash kullanıyor.

Bu örnek için biraz overkill, ancak bazı değişiklikler ile birçok sorunu çözebilecek genel bir çözümdür ...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.