Klasörü özyinelemeli olarak arama ancak svn alt klasörünü hariç tutma


10

fooSVN tarafından tutulan büyük bir dosya sisteminde tüm oluşumlarını bulmak istiyorum, ancak herhangi bir .svndizinde bulunan hiçbir şeyi eşleştirmek istemiyorum .

Yaptığımda hemen eşleşmeler alıyorum grep -l -e 'foo' *ama svn dizinlerini grep -l -e 'foo' --exclude-dir=".svn"komutla hariç tutmaya çalıştığımda sadece kilitleniyor.

Neyi yanlış yapıyorum?

Yanıtlar:


11

--exclude-dirkomut satırında dosya listeleme ihtiyacını ortadan kaldırmaz. "Asılıyorsunuz" çünkü grepstandart girişi bekliyor.

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

Varsayılan olarak hariç tutulan klasörleri ve benzer klasörleri (ve daha birçok özelliği olan) ack kullanmayı düşünün .svn.


2
Aranacak başka gizli klasörler olması durumunda, değiştirirseniz *daha temiz ..
Kevin

ya da belki de kullanmak istersiniz --recursive ., OP'nin zaten GNU'su olduğunu görmek grep.
jw013

Şahsen, shopt -s dotglobBash'te var, bu yüzden *zaten nokta dosyaları içeriyor. -rgüzel, ama ackvarsayılan olarak da yapar :)
ephemient

5

Ack ile ilgileniyor olabilirsiniz . Yinelemeli arama (ve diğer grep benzeri işlemler) yapar ve varsayılan olarak .svn veya .git gibi dizinleri hariç tutar .


Bunu bir takip olarak, şu anda agbenzer, ancak daha hızlı kullanıyorum.
WhyNotHugo

2

grep --exclude-dir...Çözelti iyi olmalı, ama sadece başka bir yol gösterebilir, kullanıcılarla ile yapabilirsiniz find'ler -prune:

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

Bir şeyi daha fazla yürütmek istiyorsanız, findbir ovadan daha iyidir grep -r:

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

1

.svn Şimdiye kadar olduğu gibi dizinlere grep istemiyorsanız , $GREP_OPTIONSdeğişkeni aşağıdaki gibi hariç tutacak şekilde ayarlayabilirsiniz :

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

Sadece bu satırı ekleyin .bashrcve özyinelemeli grepsleriniz artık .svndizinlere girmeyecek . Tabii ki, istediğiniz kadar zengin olabilir:

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

1
Ben şahsen bir takma ad kullanarak bunu yapmak, böylece aslında bu klasörleri içinde aramak gerekiyorsa, sadece değişken gıcırdamak / null olmadan çıplak grep kullanabilirsiniz, hariç tutma listesini atlayabilirsiniz. Ayrıca, kolayca genişletebileceğim ve daha fazla yazmaya gerek kalmadan hariç tutma listeme otomatik olarak eklediğim klasörlerin bir listesini tutmama izin veriyor.
dragon788

Bu iyi bir yaklaşım. Ayrıca, klasörlere grep yapmanız gerektiğinde, bir değişken ayarladığınızı unutmamanız da bir avantajdır. (Onları grep etmem gerekmediğinden değil.) Ama bu günlerde TBH bu şeyler için ag (ack klon) kullanıyorum ^^
brandizzi

0

İşte bir awk çözümü:

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

Temel olarak, tüm dosyalardan, /.svn/ ile eşleşen dosyaları budanın ve sonra bunlardan yalnızca / foo / ile eşleşen dosyaları yazdırın. Ayrıca ls ile sonuçları kolayca kullanabileceğiniz için bu çözümü beğendim. Örneğin,

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

değişiklik tarihine göre sıralanmış bir liste görünümü görmek için. Ayrıca, onlarla başka bir şey yapmak istiyorsanız sonuçların tam yoluna sahip olmak güzel (onları açın, yürütün, vb.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.