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 echo
sebelum 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 1
Argumen akan membuat xargs berubah setiap baris menjadi perintah sendiri. The sed -i "s/color/colour/g"
perintah akan mengganti semua kejadian dari color
dengan colour
untuk 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 -0
flag. 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 find
atau locate
. Jika Anda menggunakannya di repositori git dengan banyak file, mungkin lebih efisien untuk menggunakannya dengan git grep -l
daripada 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".
xargs
dan$(...)
), 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?