xargs sangat berguna ketika Anda memiliki daftar filepath di stdin dan ingin melakukan sesuatu dengannya. Sebagai contoh:
$ git ls-files "*.tex" | xargs -n 1 sed -i "s/color/colour/g"
Mari kita periksa langkah demi langkah:
$ git ls-files "*.tex"
tex/ch1/intro.tex
tex/ch1/motivation.tex
....
Dengan kata lain, input kami adalah daftar jalur yang ingin kami lakukan sesuatu.
Untuk mengetahui apa yang dilakukan xargs dengan path ini, trik yang bagus adalah menambahkan echosebelum perintah Anda, seperti:
$ 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
....
The -n 1Argumen akan membuat xargs berubah setiap baris menjadi perintah sendiri. The sed -i "s/color/colour/g"perintah akan mengganti semua kejadian dari colordengan colouruntuk file yang ditentukan.
Perhatikan bahwa ini hanya berfungsi jika Anda tidak memiliki spasi di jalur Anda. Jika Anda melakukannya, Anda harus menggunakan jalur terminasi nol sebagai input ke xargs dengan melewati -0flag. Contoh penggunaannya adalah:
$ git ls-files -z "*.tex" | xargs -0 -n 1 sed -i "s/color/colour/g"
Yang melakukan hal yang sama seperti apa yang kami jelaskan di atas, tetapi juga berfungsi jika salah satu jalur memiliki ruang di dalamnya.
Ini berfungsi dengan perintah apa pun yang menghasilkan nama file sebagai keluaran seperti findatau locate. Jika Anda menggunakannya di repositori git dengan banyak file, mungkin lebih efisien untuk menggunakannya dengan git grep -ldaripada git ls-files, seperti:
$ git grep -l "color" "*.tex" | xargs -n 1 sed -i "s/color/colour/g"
The git grep -l "color" "*.tex"perintah akan memberikan daftar "* tex" file yang berisi frasa "warna".
xargsdan$(...)), xargs jauh lebih aman daripada penggantian perintah. Dan saya tidak ingat pernah menemukan nama file yang sah dengan baris baru di dalamnya. Bukankah masalah pelarian dan perluasan kata dengan substitusi perintah, bukan xargs?