grep hanya pola subdirektori yang cocok

9

Saya memiliki pohon direktori yang terdiri dari beberapa ribu subdirektori, tetapi saya sering perlu hanya mengambil sebagian kecil dari direktori tersebut. Bagaimana saya bisa grephanya subdirektori yang cocok dengan suatu pola?

Sebagai contoh, misalkan saya memiliki subdirektori yang ingin saya bahas:

...
...
...
/foo
/fooLib
/fooHandler
/fooGizmo
...
...
...

The ...entri di atas mewakili ribuan direktori lain saya tidak ingin grep di.

Andaikata saya sedang mencari semua contoh bar, jika saya melakukan ini:

grep -n --recursive bar *

Saya akan menemukan apa yang saya cari, tetapi di semua direktori. Bagaimana saya bisa mencari hanya di subdirektori yang cocok dengan pola foo*?

John Dibling
sumber
Apakah Anda ingin mencari hanya di /foodan teman? Di /foodan /foo/bardan /foo/bar/quxdan seterusnya tetapi tidak /wibble/foo? Masuk /foodan /wibble/footapi tidak /foo/bar? Dalam /foodan /foo/bardan /wibble/footetapi tidak /elsewhere?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

11

Anda dapat menggunakan grep dan menemukan kombinasi seperti di bawah ini:

find /{foo,fooLib,fooHandler,fooGizmo} -type f -exec grep -l "test" {} \;

Atau bisa Anda gunakan

find /foo* -type f -exec grep -l "test" {} \;

Atau hanya menggunakan grep

grep -R "test" /foo*
Rahul Patil
sumber
Bisakah saya melakukan ini tanpa menentukan subdirektori secara eksplisit? Sebaliknya, dengan menggunakan wildcard seperti foo*?
John Dibling
@ JohnDibling ya saya telah memperbarui apa yang Anda katakan :)
Rahul Patil
Saran terakhir ( grep -R "test" /foo*) adalah apa yang sebenarnya saya lakukan sekarang, jadi saya akan menerimanya.
John Dibling
Terima kasih untuk ini. Saya menggunakan pola pertama, tetapi akan senang untuk memahami beberapa hal tentang hal itu - misalnya, apa yang akhir {}dan backslash lakukan?
random_user_name
Ini memberikan garis yang cocok dengan grep, tetapi lokasi data (file yang ada di dalamnya) hilang. Apakah ada cara untuk mempertahankan itu?
Jontia
0

coba grep foo* <other parts>misalnya:grep foo* -name "book*"

harish.venkat
sumber
Jika saya mencari semua instance dari barsemua file dalam subdirektori bernama foo*, haruskah ini seperti ini grep --recursive bar ./foo*/*:?
John Dibling