bagaimana melakukan operasi grep pada semua file dalam direktori

218

Bekerja dengan xenserver, dan saya ingin melakukan perintah pada setiap file yang ada di direktori, mengeluarkan beberapa hal dari output perintah dan menambahkannya dalam file.

Saya jelas pada perintah yang ingin saya gunakan dan bagaimana mengeluarkan string yang diperlukan.

Tapi yang saya tidak jelas adalah bagaimana saya menjalankan perintah ini pada setiap file, pergi ke yang berikutnya, sampai tidak ada lagi file yang ditemukan.

pengguna2147075
sumber

Jawaban:

228

grep $PATTERN *akan cukup. Secara default, grep akan melewati semua subdirektori. Namun, jika Anda ingin menerimanya, grep -r $PATTERN *inilah masalahnya.

umi
sumber
37
"grep -r $ POLA." Cukup. Untuk grep rekursif Anda tidak perlu menentukan semua file
Cougar
1
Bagaimana cara saya memasukkan beberapa ekstensi? Misalnya. "* .cpp", "* .h"?
Tomáš Zato - Reinstate Monica
1
@ Tomáš Zato, hanya menyediakan semua pola file Anda bukan *: grep $PATTERN *.cpp *.h. Jika Anda memerlukan aturan yang lebih spesifik untuk file apa yang harus dipahami, gunakan findperintah (periksa jawaban Rob).
umi
@umi Jika saya menjalankan grep -r x .hasil datang dari semua file dari semua ekstensi. Jika saya lari maka grep -r x *.scsssaya tidak mendapat hasil.
Chris
1
@ Chris mungkin Anda tidak memiliki *.scssfile di direktori saat ini tetapi di suatu tempat yang lebih dalam di subdirs sehingga grep tidak melihat semua file yang Anda inginkan. Anda harus menggunakan --includeopsi untuk memberi tahu grep agar mencari file yang cocok dengan pola tertentu secara rekursif: grep -r x --include '*.scss' . (perhatikan tanda kutip, mereka mencegah polanya tidak diperluas oleh shell). Atau gunakan saja find(lihat jawaban Rob).
umi
168

Di Linux, saya biasanya menggunakan perintah ini untuk secara grep menerima teks tertentu dalam suatu dir

grep -rni "string" *

dimana,

r = rekursif yaitu, mencari subdirektori dalam direktori saat ini
n = untuk mencetak nomor baris ke stdout
i = pencarian case-sensitive

Narain
sumber
32

Gunakan temukan. Serius, ini adalah cara terbaik karena Anda dapat benar-benar melihat file apa yang beroperasi:

find . -name "*.sql" -exec grep -H "slow" {} \;

Catatan, -H adalah spesifik mac, ini menunjukkan nama file dalam hasil.

rampok
sumber
7
Jika Anda memutuskan untuk menggunakan find, pipa keluaran melalui xargsdaripada menggunakan -execini akan jauh lebih cepat, karena -execmemunculkan proses baru untuk setiap grep, dan overhead menjadi signifikan dengan sejumlah besar file. Peringatan standar tentang spasi dalam nama file berlaku untuk xargs.
Barton Chittenden
2
Seperti apa tepatnya ini? Saya selalu lupa xargssintaksisnya.
Brian Peterson
3
@BrianPeterson akan seperti itu:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince
4

Untuk mencari di semua sub-direktori, tetapi hanya dalam tipe file tertentu , gunakan grep with --include.

Misalnya, mencari secara rekursif di direktori saat ini, untuk teks dalam * .yml dan * .yaml:

grep "text to search" -r . --include=*.{yml,yaml}
Noam Manos
sumber
1

Jika Anda ingin melakukan banyak perintah, Anda dapat menggunakan:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
Bryan
sumber