Folder pencarian secara rekursif tetapi mengecualikan subfolder svn


10

Saya ingin menemukan semua kejadian foodalam sistem file besar yang dikelola oleh SVN tetapi saya tidak ingin mencocokkan apa pun yang ada di .svndirektori mana pun .

Saya mendapatkan kecocokan langsung ketika saya melakukannya grep -l -e 'foo' *tetapi ketika saya mencoba dan mengecualikan direktori svn dengan grep -l -e 'foo' --exclude-dir=".svn"perintah yang baru saja hang.

Apa yang saya lakukan salah?

Jawaban:


11

--exclude-dirtidak menggantikan kebutuhan untuk membuat daftar file pada baris perintah. Anda "menggantung" karena grepmenunggu input standar.

grep -l -e 'foo' --exclude-dir = ". svn" *

Pertimbangkan untuk menggunakan ack , yang mengecualikan .svndan folder serupa (dan memiliki banyak fitur lainnya) secara default.


2
Pembersih jika Anda mengubah *ke ., jika ada folder tersembunyi lain yang harus dicari.
Kevin

atau mungkin Anda ingin menggunakannya --recursive .sebagai gantinya, karena OP telah memiliki GNU grep.
jw013

Secara pribadi, saya miliki shopt -s dotglobdi Bash, jadi *sudah berisi file-dot. -rbagus, tetapi ackapakah itu secara default juga :)
ephemient

5

Anda mungkin tertarik pada ack . Itu pencarian berulang (dan operasi seperti grep lainnya), dan mengecualikan direktori seperti .svn atau .git secara default.


Sebagai tindak lanjut dari ini, saya saat ini menggunakan ag, yang mirip, tetapi lebih cepat.
WhyNotHugo

2

The grep --exclude-dir...solusi harus baik-baik, tapi hanya untuk menunjukkan cara lain, Anda dapat melakukan ini dengan find's -prune:

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

Jika Anda ingin menjalankan sesuatu lebih jauh, findlebih baik daripada yang biasa grep -r:

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

1

Jika Anda tidak ingin masuk ke direktori seperti .svn sebelumnya, Anda dapat mengatur $GREP_OPTIONSvariabel untuk mengecualikannya seperti di bawah ini:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

Cukup tambahkan baris ini ke Anda .bashrcdan grep rekursif Anda tidak akan lagi masuk ke .svndirektori. Tentu saja, itu bisa sekaya yang Anda inginkan:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"

1
Saya pribadi melakukan ini dengan menggunakan alias sehingga saya dapat mem-bypass daftar pengecualian jika saya harus benar-benar mencari di dalam folder-folder tersebut. Saya hanya dapat menggunakan bare grep tanpa harus menghapus / membatalkan variabel. Ini juga memungkinkan saya mempertahankan daftar folder yang dapat saya buka dengan mudah dan secara otomatis ditambahkan ke daftar pengecualian tanpa harus melakukan lebih banyak pengetikan.
dragon788

Itu pendekatan yang bagus. Ini juga memiliki keuntungan bahwa, jika Anda perlu masuk ke folder, Anda tidak akan lupa Anda mengatur variabel. (Bukan berarti saya pernah perlu untuk menangkap mereka.) Tapi TBH hari ini saya menggunakan ag (klon ack) untuk hal-hal ini ^^
brandizzi

0

Ini solusi awk juga:

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

Pada dasarnya, dari semua file, pangkas file-file yang cocok dengan /.svn/ lalu, dari semua itu, cetak hanya file-file ini yang cocok dengan / foo /. Saya juga suka solusi ini karena Anda dapat dengan mudah menggunakan hasilnya dengan ls. Misalnya, Anda bisa menggunakan

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

untuk melihat tampilan daftar diurutkan berdasarkan tanggal modifikasi. Juga, senang memiliki hasil lengkap jika Anda ingin melakukan sesuatu yang lain dengan mereka (buka, jalankan, dll.)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.