tek argümanlar için xargs --replace / -I


10

Her sağlanan bağımsız değişken için bir komut çalıştırmak için xargs kullanmaya çalışıyorum, ama ne yazık ki --replace / -I bayrağı -n ile konjuge zaman düzgün çalışmıyor gibi görünüyor. Görünüşe göre {}, -n seçeneğinden bağımsız olarak stdin'den okunan argümanların tam listesine genişleyecek.

Ne yazık ki, web'deki tüm örnekler {} 'nin genişletildiği birden fazla argüman alacak komutlar (mv, cp, rm) için görünmektedir.

Örneğin, çalışırken:

echo a b c d | xargs -n 1 -I {} echo derp {}

Çıktı:

derp a b c d

Ama bekledim:

derp a
derp b
derp c
derp d

Ancak, -I {} olmadan çalıştırılması beklenen sonucu verir:

echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d

Bunu xargs ile başarmanın bir yolu var mı? Nihai niyetim, birden fazla (parralel) ssh oturumu çalıştırmak için kullanmak, örneğin

echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'

xargs (GNU findutils) 4.4.2RHEL 6.3 üzerinde çalışıyorum .


2
İlginçtir, BSD ile niyet ettiğiniz gibi çalışır xargs, ancak GNU ile çalışmaz xargs.
slhck

1
man xargson -I: Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.Yani tasarlandığı gibi davranır.
Daniel Beck

@ André, amacınız görevleri paralel olarak yürütmek olduğundan, GNU paraleline bir göz attınız mı? İşi güzel yapıyor. Yasal Uyarı: Debian için paketliyorum.
rbrito

GNU paralel iyi bir yedek gibi görünüyordu, ama ne yazık ki bu belirli ana bilgisayara yükleyemiyorum.
André Fernandes

Eğer sebep kapsamında değildir eğer @ AndréFernandes sen ayrıntılara girebilir oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html
Ole Tange

Yanıtlar:


5

Beklediğiniz sonuca ulaşmak için yeni satırlarla yankılayabilirsiniz. Sunucu genişletme ile ilgili durumunuz:

$ echo -e server{1..4}"\n" | xargs -I{} echo derp {}
derp server1
derp server2
derp server3
derp server4

Yeni satır fikri bu soruna geçici bir çözüm getirir (tam örneğinizle değil): echo server {1..4} | tr '' '\ n' | xargs -I {} echo derp {} derp sunucusu1 derp sunucusu2 derp sunucusu3 derp sunucusu4
André Fernandes

Üzgünüm, test ettim zsh... Cevabım düzeltildi. seçeneğe echoihtiyacı var -e.
ahilsend

2

Bunun gibi ekstra bir borudan faydalanabilirsiniz,

echo a b c d | xargs -n1 | xargs -I{} echo derp {}
derp a
derp b
derp c
derp d

'-N1' seçeneği nedeniyle xargs 'echos'un her harfi' abcd 'ara kullanımı. Bu, her harfi kendi satırına böyle koyar,

echo a b c d | xargs -n1
a
b
c
d 

-I (dize değiştirme) kullanırken xargs, her satırda bir kez yardımcı program komutunu (sizin durumda yankı) yürüten -L anlamına gelir. Ayrıca, -N ile -L birlikte kullanılamaz, çünkü bunlar birbirini dışlar.

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.