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 1
Argü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 color
olan colour
belirtilen dosya için.
Bunun yalnızca yollarınızda boşluk yoksa işe yarayacağını unutmayın. Bunu yaparsanız, -0
bayrağı 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 find
veya gibi çıktı olarak veren herhangi bir komutla çalışır locate
. Çok sayıda dosya içeren bir git deposunda kullanıyorsanız, git grep -l
bunun 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.
xargs
ve$(...)
) 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?