xargs mengambil input standar dan mengubahnya menjadi baris perintah args.
find . -name '*.c' | xargs grep 'stdlib.h'
sangat mirip dengan
grep 'stdlib.h' $(find . -name '*.c') # UNSAFE, DON'T USE
Dan akan memberikan hasil yang sama selama daftar nama file tidak terlalu panjang untuk satu baris perintah. (Linux mendukung megabyte teks pada satu baris perintah, jadi biasanya Anda tidak perlu xargs.)
Tetapi keduanya menyebalkan, karena mereka rusak jika nama file Anda mengandung spasi . Sebaliknya, find -print0 | xargs -0
bekerja, tetapi begitu juga
find . -name '*.c' -exec grep 'stdlib.h' {} +
Itu tidak pernah menyalurkan nama file di mana saja: find
batch mereka menjadi baris perintah besar dan berjalan grep
secara langsung.
\;
bukannya +
menjalankan grep secara terpisah untuk setiap file, yang jauh lebih lambat. Jangan lakukan itu. Tetapi +
ini adalah ekstensi GNU, jadi Anda harus xargs
melakukan ini secara efisien jika Anda tidak dapat menganggap GNU find.
Jika Anda keluar xargs
, find | grep
apakah polanya cocok dengan daftar nama file yang find
dicetak.
Jadi pada titik itu, sebaiknya Anda lakukan saja find -name stdlib.h
. Tentu saja, dengan -name '*.c' -name stdlib.h
, Anda tidak akan mendapatkan hasil apa pun karena pola-pola itu tidak bisa cocok, dan perilaku default find adalah untuk DAN aturan bersama.
Gantikan less
pada titik mana saja dalam proses untuk melihat output apa saja yang dihasilkan oleh bagian pipa.
Bacaan lebih lanjut: http://mywiki.wooledge.org/BashFAQ memiliki beberapa hal hebat.