Solusi 1:
Anda bisa menggunakan grep:
grep -rn 'classname' /path/to/source
Ini juga akan mencetak nomor baris di samping setiap kecocokan.
Peka huruf besar/kecil:
grep -rin 'classname' /path/to/source
Cari non-rekursif di semua file cpp:
grep -n 'classname' /path/to/source/*.cpp
Solusi 2:
Semua jawaban di atas akan bekerja dengan baik, tetapi dapat menyebabkan kesalahan positif jika Anda memiliki string lebih dari sekadar kode sumber. Katakanlah Anda sedang mencari di mana Anda menggunakan kelas FooBar dalam proyek java, Anda dapat mencari semua file bernama *.java dan grep hanya itu.
# grep "FooBar" -Hn $(find -name "*.java")
Bagian di antara $() akan meluas ke output dari perintah itu. -H mencetak nama file. Ini default di mana ada lebih dari satu nama file, tetapi kami secara eksplisit menambahkannya di sini jika perluasan hanya mengembalikan satu nama file. -n mencetak nomor baris dari kecocokan.
Ini akan berfungsi untuk proyek kecil, tetapi jika Anda berurusan dengan proyek yang lebih besar, ada potensi penemuan untuk memperluas string lebih lama dari batas baris perintah. Oleh karena itu lebih aman untuk digunakan:
# find -name "*.java" -print0 | xargs -0 grep "FooBar" -Hn
xargs akan mengambil input dari standar dan membaginya sehingga sesuai dengan baris perintah, menjalankan perintah beberapa kali jika perlu. -print0 dan -0 diperlukan untuk menangani file dengan spasi di namanya.
Anda juga dapat mencari semua nama file yang cocok menggunakan:
# find -name "*.java" -print0 | xargs -0 grep "FooBar" -l
-l hanya akan menampilkan nama file dan berhenti mencari di file tertentu segera setelah menemukan kecocokan.
Jika Anda akan sering melakukan hal semacam ini, Anda mungkin ingin melihat alat seperti ctag atau tag bersemangat, yang menyimpan indeks pencarian kode sumber Anda dan dapat menjawab pertanyaan semacam ini dengan cepat. Baik vim dan emacs memiliki dukungan untuk alat ini. Anda mungkin juga ingin melihat IDE seperti gerhana, yang dapat melakukan referensi silang dengan sangat baik.
(Saya tahu Anda sedang mencari definisi kelas, tetapi di Java kelas akan ditentukan dalam file dengan nama yang sama dengan kelas. Jika Anda mengerjakan cpp, Anda dapat melakukan sesuatu seperti:
# find -name "*.cpp" -o -name "*.cc" -o -name "*.h" -o -name "*.hpp" -print0 | \
xargs -0 egrep "class\s+FooBar" -Hn
Solusi 3:
Untuk mencari melalui kode sumber, saya telah menemukan bahwa ack (betterthangrep.com), mengutip pemasaran, lebih baik daripada grep. Keluarannya lebih mudah dibaca dan akan melakukan banyak hal secara otomatis, seperti mengabaikan file kode non-sumber:direktori VCS (misalnya CVS dan .svn), file cadangan.
Solusi 4:
ack lebih baik untuk mencari kode sumber karena sudah mengenali beberapa ekstensi file paling populer (c, perl, dll). Ini secepat grep dan secara default mengabaikan semua artefak kontrol versi Anda. Misalnya jika Anda ingin mencari beberapa kode sumber perl pola, Anda dapat menggunakan
ack --perl pattern
bukannya
grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)