GNU/Linux >> Belajar Linux >  >> Linux

Mencari sejumlah file untuk sebuah string di LInux

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)

Linux
  1. Periksa file konfigurasi Linux untuk kesalahan sintaks

  2. Jumlah maksimum file/direktori di Linux?

  3. Mencari string di banyak file di Linux

  1. Cara Meningkatkan Jumlah Batas File Terbuka di Linux

  2. Jumlah File yang Mengandung String yang Diberikan?

  3. Kecualikan file tersembunyi saat mencari dengan Unix/Linux temukan?

  1. Linux – Bagaimana Mengetahui Apa yang Harus Diambil Di Dmesg?

  2. linux:cari file bertipe *.php yang baru saja dimodifikasi

  3. grep secara rekursif untuk jenis file tertentu di Linux