Grep in file dengan ekstensi spesifik di bawah direktori

11

Apakah ada perintah yang memungkinkan pencarian kata kunci dalam file di bawah direktori dengan ekstensi spesifik?

String grep -irn "string" ./pathmemberikan pencarian rekursif untuk semua file di bawah direktori ./path. Persyaratan khusus saya adalah untuk mencari di semua file di bawah ./pathdengan ekstensi seperti*.h

Ginu Jacob
sumber

Jawaban:

11

Setelah beberapa cobaan, saya pikir grep -irn 'string' --include '*.h'lebih berguna

Ginu Jacob
sumber
1
Jika Anda akan melakukannya, pastikan untuk memasukkan "*.h"tanda kutip.
G-Man Mengatakan 'Reinstate Monica'
Ini bekerja dengan dan tanpa tanda kutip
Ginu Jacob
3
Sekarang sudah. Coba buat file yang disebut foobar.hdi direktori saat ini, dan coba lagi.
G-Man Mengatakan 'Reinstate Monica'
10

S et (menyalakan) yang sh ell opt ion globstardengan perintah

    shopt -s globstar

Ini akan menyebabkan **komponen nama file berarti semuanya di sini dan di bawah. Jadi path/**berarti semua yang ada di pathdirektori dan subdirektori . (Anda tidak perlu mengetik di ./sini.) Maka Anda dapat menggunakan

grep -in "string" path/**/*.h

untuk mencari semua .hfile di dalam dan di bawah path.


Anda dapat u NSET pilihan dengan shopt -u.

G-Man Mengatakan 'Reinstate Monica'
sumber
5
find /path -iname "*.h" -exec grep -inH "string" "{}" \;
Ipor Sircer
sumber
1
-exec... +bagus juga.
G-Man Mengatakan 'Reinstate Monica'
1
Saya baru saja perhatikan - Anda lupa memasukkan "string"jawaban Anda!
G-Man Mengatakan 'Reinstate Monica'
3

Jika Anda dapat menginstal sesuatu di mesin Anda, saya sarankan menggunakan ack .

Anda dapat melakukan apa yang Anda butuhkan dengan itu dan banyak lagi. Untuk kasus penggunaan Anda, Anda dapat melakukan:

# Depending of your system, you have to use one or the other
ack --hh -i string path
ack-grep --hh -i string path
  • --hh filter pada file h
  • -Aku mengabaikan kasingnya

Untuk menemukan filter file mana yang didukung secara asli, jalankan perintah ack --help=type.

IKLAN
sumber
Ada juga ag , mantan klon ACK. Sebelumnya, karena set fitur mereka sejak itu agak berbeda.
8bittree
Saya tidak tahu ag. Terima kasih telah berbagi.
AD
3

Bagaimana dengan yang ini?

find -L ./path -name "*.h" -exec grep -in "string" {} \;

Penjelasan:

  • -L: ikuti symlinks
  • -nama: menggunakan tanda bintang, Anda dapat menjelaskan ekstensi
  • -in: sama dengan proposal Anda, tetapi 'r' digantikan oleh findperintah
  • {}: ini adalah singkatan dari hasil findperintah
  • \; : jika Anda bergabung finddengan -exec, ini adalah specifier end-of-command
Dominique
sumber
1
Bagaimana cara "*.h"kerjanya? Saya akan berpikir itu perlu'*.h'
Joe
Saya selalu bekerja dengan tanda kutip ganda, saya tidak berpikir itu membuat perbedaan.
Dominique
0

Jika Anda menggunakan gnu grep maka ada bendera yang melakukan persis seperti yang Anda inginkan:

grep -irn --include=\*.h "string" path

walaupun saya tidak berpikir itu tersedia di greps lain.

tolong
sumber