xargs -I replace-str seçenek farkı


16

Anladığım kadarıyla, aşağıdakiler tamamen aynı anlama gelmelidir:

ls -1 | xargs file {}
ls -1 | xargs -I{} file {}

-I seçeneği belirtilmezse, varsayılan olarak -I {} olarak ayarlanır.

Geçerli dizindeki tüm dosyaları listelemek ve fileher birinde komut çalıştırmak istiyorum . Bazılarının isimlerinde boşluklar var. Ancak farkı fark ettim. Aşağıya bakınız:

$ ls -1
Hello World
$ ls -1 | xargs file {}
{}:    ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory

-I {} açıkça belirtildiğinde, dosya adlarındaki boşluklar beklendiği gibi işlenir.


3
"-I seçeneği belirtilmezse, varsayılan olarak -I {}" şeklindedir - bu yanlıştır, en azından GNU xargs ile.
jjlin

Hatamı anlıyorum. Ben de belirtmelidir xargs fileveya xargs -I{} file {}. Olmamalı xargs file {}. Açıkça -I {} belirtirken, bash bunu ele alacaktır file "Hello World". -I {} olmadan file Hello World,.
foresightyj

1
(1) Bu tartışmanın kabuk (bash) ile ilgisi yoktur. (2) -1Seçeneği bilmeniz iyi ls, ancak çıktısı lsbir dosya veya bir boru olduğunda varsayılan olarak açıktır, bu yüzden burada buna ihtiyacınız yoktur. (3) Kullanımdan -Ikaldırılmış -i(küçük harf I) seçenekle karıştırıyorsunuz. -ifooeşittir -Ifoo, ancak düz -ieşittir -I{}. Ama kullanın -I{}. (4) Gerçekten söylemek istediğiniz şeyi yapmak istiyorsanız, neden sadece söylemiyorsunuz file *?
Scott

@Scott Asıl amacım `find 'yazmaktı. -adı "* .mov" | Tüm mov dosyalarını özyinelemeli olarak bulmak ve fileüzerinde çalıştırmak için xargs -I {} dosya {} ` . Ama kullanarak daha basit bir örnek buldum ls. Haklısın. Bunun için file *en iyisi.
foresightyj

1
bulmak vardır -exec.
Cristian Ciupitu

Yanıtlar:


20

Gereken -Itanımlı bir yer tutucu gerektirir. -iÜstlenecek seçenek {}tutucudur. Burada man xargsen azından Cygwin ve CentOS'ta {} varsayımı buldum .

Her iki seçenek olmadan da çağrılan xargs yer tutucusuna ihtiyaç duymaz ve yalnızca STDIN değerini bağımsız değişkenlerin sonuna ekler.

echoXargs'ın ne yaptığını görmek için örneklerinize eklemeniz yeterlidir:

$ ls -1
Hello World/

Örneğinizde yanlışlıkla şunlar kullanılıyor {}:

$ ls -1 | xargs echo file {}
file {} Hello World/

böylece filecmd argümanları {} Hello Worldve hataları görür .

Xargs çağrınızda açıkça kullanmak istiyorsanız {}:

$ ls -1 | xargs -i echo file {}
file Hello World/

Veya Yer tutucu yok:

$ ls -1 | xargs echo file
file Hello World/

Yukarıda belirtildiği gibi xargs {} 'a ihtiyaç duymaz. STDIN'i yer tutucu olmadan komutun sonuna ekler. {} Kullanımı genellikle STDIN'in cmd'nin ortasında bir yerde yürütülmesini istediğiniz anlamına gelir:

$ ls -1 | xargs -i mv {} /path/to/someplace/.

Bu çok açık. Cevabınız biraz geç olsa da, onu okumak gerçekten anlayışımı pekiştiriyor.
öngörü
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.