Pencarian teks rekursif dengan pola grep dan file

46

Diberikan contoh struktur folder ini:

/folder1/file1.txt
/folder1/file2.djd
/folder2/file3.txt
/folder2/file2.fha

Bagaimana cara saya melakukan pencarian teks rekursif pada semua *.txtfile dengan grepdari "/"?

( "grep -r <pattern> *.txt"gagal ketika dijalankan dari "/", karena tidak ada .txtfile di folder itu.)

Anders Sandvig
sumber

Jawaban:

61

Versi GNU Grep saya memiliki saklar untuk ini:

grep -R --include='*.txt' $Pattern

Dijelaskan sebagai berikut:

--include=GLOB

Cari hanya file yang nama dasarnya cocok dengan GLOB (menggunakan pencocokan wildcard seperti yang dijelaskan pada --exclude).

Kyle Brandt
sumber
19

Jika Anda memiliki banyak file, akan berguna untuk memasukkan xargs ke dalam perintah untuk menghindari kesalahan 'Daftar argumen terlalu panjang'.

find . -name '*.txt' -print | xargs grep <pattern>
Menandai
sumber
6
Jika ada spasi di salah satu nama file atau direktori, gunakan formulir ini: find. -nama '* .txt' -print0 | xargs -0 grep <pattern>
Jason Luther
2
Dan tentu saja ada masalah nama file yang dimulai dengan -.
TJ Crowder
greplebih cepat dari find.
Nabi KAZ
2

Anda mungkin bisa memanfaatkan Anda zsh's EXTENDED_GLOBpilihan ( docs )

grep <pattern> **/*.txt
santa
sumber
Hanya jika OP menggunakan zsh, namun tetap menarik.
Law29
1

Anda mungkin ingin melihat ack di http://betterthangrep.com , yang memiliki fasilitas untuk memilih file yang akan dicari berdasarkan filetype.

Andy Lester
sumber
0
find . -name '*.txt' -type f -exec grep <pattern> {} \;
innaM
sumber
Anda mungkin ingin menggunakan "find. -name '* .txt' -type f -exec grep <pattern> {} +" sebagai gantinya sehingga agak berperilaku serupa dengan verifikasi dari Mark Robinson - hanya bekerja dengan GNU, setahu saya.
serverhorror
0

Jawaban Mannis akan melakukan proses grep baru untuk setiap file teks. Jika Anda memiliki banyak file teks di sana, Anda dapat mempertimbangkan untuk menangkap setiap file terlebih dahulu dan memilih file .txt ketika itu dilakukan:

grep -r <pattern> * | grep \.txt:

Itu lebih intensif disk, tetapi mungkin lebih cepat pula.

Komandan Keen
sumber
0

Ini tahun 2019 dan tidak mungkin saya masih menggunakan grep untuk pencarian teks rekursif.

Jawaban IMHO todays harus mencakup ripgrep :

rg <pattern> -ttxt
santa
sumber