xargs özellikle stdin'deki bir filepat listeniz varsa ve onlarla bir şeyler yapmak istediğinizde kullanışlıdır. Örneğin:
$ git ls-files "*.tex" | xargs -n 1 sed -i "s/color/colour/g"
Bu adımı adım adım inceleyelim:
$ git ls-files "*.tex"
tex/ch1/intro.tex
tex/ch1/motivation.tex
....
Başka bir deyişle, girişimiz bir şey yapmak istediğimiz yolların bir listesidir.
Xargs'ın bu yollarla ne yaptığını bulmak için echo, komutunuzdan önce şöyle eklemek için güzel bir numara ekleyin :
$ git ls-files "*.tex" | xargs -n 1 echo sed -i "s/color/colour/g"
sed -i "s/color/colour/g" tex/ch1/intro.tex
sed -i "s/color/colour/g" tex/ch1/motivation.tex
....
-n 1Argüman Xargs kendine ait bir komuta içine her satırı açmak yapacaktır. sed -i "s/color/colour/g"Komut tüm oluşumları yerini alacak colorolan colourbelirtilen dosya için.
Bunun yalnızca yollarınızda boşluk yoksa işe yarayacağını unutmayın. Bunu yaparsanız, -0bayrağı geçerek boş uçlu yolları xargs'a girdi olarak kullanmalısınız . Örnek bir kullanım:
$ git ls-files -z "*.tex" | xargs -0 -n 1 sed -i "s/color/colour/g"
Yukarıda tarif ettiğimizle aynı olan, ancak yollardan birinin içinde bir boşluk varsa da çalışır.
Bu, dosya ismini findveya gibi çıktı olarak veren herhangi bir komutla çalışır locate. Çok sayıda dosya içeren bir git deposunda kullanıyorsanız, git grep -lbunun yerine bununla kullanmak daha verimli olabilir git ls-files:
$ git grep -l "color" "*.tex" | xargs -n 1 sed -i "s/color/colour/g"
git grep -l "color" "*.tex"Komut ifadesini "renk" içeren "* .tex" dosyaların bir listesini verecektir.
xargsve$(...)) akış vermek için kullanılan iki yaygın seçenek arasında , xargs komut değiştirmeden çok daha güvenlidir. Ve meşru bir dosya ismine, içinde yeni bir çizgiyle geldiğimi hatırlayamıyorum. Kaçış ve kelime genişletme tuzaklar, xargs ile değil, komut değiştirme ile ilgili sorunları değil midir?