Temukan string hanya di file tertentu di dalam subdirektori

10

Katakanlah saya perlu menemukan fungsi GetTypes()di semua file sumber C # ( .cs) direktori / subdirektori.

Saya menggunakan grep -rn GetTypes *.cs, tapi saya punya kesalahan dengan grep: *.cs: No such file or directory. Saya harus menggunakan grep -rn GetTypes *, tetapi dalam hal ini menunjukkan semua file tidak *.cshanya.

Perintah apa yang harus saya gunakan untuk menemukan string hanya dalam .csfile?

prosseek
sumber
mungkin duplikat Menemukan substring dalam file melintasi subdirektori dengan satu perintah bawaan?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

12

Jika shell Anda bash ≥4, menempatkan shopt -s globstardi Anda ~/.bashrc. Jika shell Anda zsh, Anda baik-baik saja. Maka Anda bisa lari

grep -n GetTypes **/*.cs

**/*.cs berarti semua file cocok *.cs di direktori saat ini, atau di subdirektori, secara rekursif.

Jika Anda tidak menjalankan shell yang mendukung **tetapi grep Anda mendukung --include, Anda dapat melakukan grep rekursif dan memberi tahu grepuntuk hanya mempertimbangkan file yang cocok dengan pola tertentu. Perhatikan tanda kutip di sekitar pola nama file: itu ditafsirkan oleh grep, bukan oleh shell.

grep -rn --include='*.cs' GetTypes .

Dengan hanya alat portabel (beberapa sistem tidak memiliki grep -rsama sekali), gunakan finduntuk bagian traversal direktori, dan grepuntuk bagian pencarian teks.

find . -name '*.cs' -exec grep -n GetTypes {} +
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Untuk set sementara yang globstarpilihan untuk saat ini Bash 4 + shell, gunakan: shopt -s globstar.
tjanez
8

Anda harus memeriksa pengganti grep / find gril yang dikenal sebagai ack . Ini secara khusus diatur untuk mencari melalui direktori file kode sumber.

Perintah Anda akan terlihat seperti ini:

ack --csharp GetTypes
Caleb
sumber
4

Jika Anda menggunakan GNU grep, Anda dapat menentukan file mana yang akan dimasukkan dalam traversal direktori rekursif:

grep --include '*.cs' -rn GetTypes .

(di mana periode terakhir menunjukkan direktori kerja saat ini sebagai root dari traversal)

maxschlepzig
sumber
4

Saya menggunakan kombinasi find dan grep:

find . -name "*.cs" | xargs grep "GetTypes" -bn --color=auto

Sebab find, Anda bisa mengganti .dengan direktori dan menghapus-name jika Anda ingin mencari di setiap file.

Sebab grep, -bnakan mencetak posisi dan nomor garis dan --colorakan membantu mata Anda dengan menyorot apa yang Anda cari.

Kevin
sumber