Di Windows, jika saya ingin menemukan string di semua file di semua subdirektori, saya akan melakukan sesuatu seperti
findstr /C:"the string" /S *.h
Namun, di Linux (katakanlah, Ubuntu) saya telah menemukan ada cara lain selain beberapa perintah pipa yang melibatkan find
, xargs
dan grep
(contoh adalah di halaman ini: ? Bagaimana saya bisa rekursif grep melalui sub-direktori ). Namun, pertanyaan saya berbeda: apakah ada perintah tunggal yang terpasang melalui sulap ini, tanpa harus menulis skrip shell saya?
*
ke'*'
: "Mengutip wildcard terakhir diperlukan untuk menghindari kesalahan ketika beberapa nama file dimulai dengan -"-Msomething
, atau karenaGREP_OPTIONS
pengaturan.grep -r searchpattern /path/to/start/in
Di mana
/path/to/start/in/
".
" hanya bisa untuk direktori saat ini.sumber
Tidak.
find -name \*.h -print0 | xargs -0 grep -l 'the regex'
Sama ajaibnya.sumber
-r
opsinya. Tidak perlu artileri berat.xargs
menambahkan hanya kebisingan. Gunakanfind -name \*.h -execdir grep -l 'the regex {} +
Untuk menjadi bertele-tele, tidak, Anda tidak dapat menganggap perintah seperti itu ada .
Ada banyak implementasi Unix yang berbeda, dan masing-masing memiliki kebiasaan yang berbeda. POSIX, penyebut yang umum (dan hal yang paling dekat dengan standar di seluruh Unices) tidak menentukan opsi seperti itu untuk
grep
.Seperti disebutkan dalam jawaban lain, implementasi GNU
grep
memiliki opsi non-standar yang melakukan apa yang Anda inginkan. Walaupun implementasi khusus ini mungkin umum pada sistem Linux, Anda tidak dapat mengasumsikan ketersediaannya pada Unix apa pun, bahkan pada beberapa sistem Linux.Akhirnya, saya harus menyebutkan bahwa itu adalah filosofi Unix untuk mendukung kombinasi beberapa program primitif, daripada penggunaan satu executable monolitik besar yang mencoba melakukan semuanya sekaligus.
Dalam kasus Anda, merayapi sistem file dan mencocokkan regexp dalam aliran adalah dua tugas terpisah. Adalah normal untuk memperlakukan masing-masing dalam program yang terpisah.
sumber
Untuk menemukan string dari direktori yang diberikan gunakan perintah di bawah ini
Sebagai contoh:
sumber
grep
dapat mengambil lebih dari satu file sebagai argumen, jadi Anda harus menggunakan+
alih-alih\;
menghindari menjalankan satugrep
permintaan per file yang cukup tidak efisien.-name '*'
membatasi file yang namanya teks yang valid di lokal saat ini (find
setidaknya dalam beberapa implementasi), tetapi komponen direktori lainnya mungkin masih mengandung urutan byte yang tidak membentuk karakter yang valid. Jika maksud Anda dengan itu-name '*'
adalah untuk memastikan output teks yang valid (dengan menghilangkan file dengan nama yang tidak benar), Anda lebih suka menggunakanfind ... ! -name '*' -prune -o -exec grep ... {} +
, yang juga akan berhentifind
turun ke direktori dengan nama yang tidak benar.