.Svn dizinlerini yoksaymak için nasıl "bul" alabilirim?


227

Ben sık sık findkaynak kodu aramak, dosyaları silmek için bu komutu kullanın. Rahatsız edici bir şekilde, Subversion her dosyanın kopyalarını .svn/text-base/dizinlerinde sakladığından, basit aramalarım çok sayıda yinelenen sonuç elde ediyor. Örneğin, ben yinelemeli aramak istediğiniz uintkatları messages.hve messages.cppdosyalar:

# find -name 'messages.*' -exec grep -Iw uint {} +
./messages.cpp:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
./messages.cpp:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
./messages.cpp:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
./messages.cpp:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
./messages.cpp:        for (uint i = 0; i < 10 && !_stopThreads; ++i) {
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
./.svn/text-base/messages.cpp.svn-base:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:        for (uint i = 0; i < 10 && !_stopThreads; ++i) {
./virus/messages.cpp:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
./virus/messages.cpp:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
./virus/messages.h:    void _progress(const std::string &fileName, uint scanCount);
./virus/messages.h:    ProgressMessage(const std::string &fileName, uint scanCount);
./virus/messages.h:    uint        _scanCount;
./virus/.svn/text-base/messages.cpp.svn-base:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
./virus/.svn/text-base/messages.cpp.svn-base:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
./virus/.svn/text-base/messages.h.svn-base:    void _progress(const std::string &fileName, uint scanCount);
./virus/.svn/text-base/messages.h.svn-base:    ProgressMessage(const std::string &fileName, uint scanCount);
./virus/.svn/text-base/messages.h.svn-base:    uint        _scanCount;

Dizinleri findyoksaymayı nasıl söyleyebilirim .svn?


Güncelleme : SVN istemcinizi 1.7 sürümüne yükseltirseniz, bu artık sorun değildir.

Subversion 1.7'de yapılan değişikliklerin temel özelliği, çalışan kopya meta veri depolamanın tek bir yerde merkezileştirilmesidir. .svnSubversion 1.7 çalışan kopyaların her dizindeki bir dizin yerine , çalışan kopyanın .svnkökünde yalnızca bir dizin bulunur. Bu dizin (diğer şeylerin yanı sıra), bu çalışma kopyası için Subversion'ın tüm meta verilerini içeren bir SQLite destekli veritabanı içerir.


4
Performans için, find ... -print0 | xargs -0 egrep ...yerine kullanmayı deneyin find ... -exec grep ...( grepher dosya için çatal değil , aynı anda bir grup dosya için). Bu formu .svnkullanarak, -prunebulma seçeneğini kullanmadan dizinleri de find ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...
budayabilirsiniz

3
@Vlad: Bildiğim kadarıyla kullanarak -execile +çatal değil greponu kullanırken, her dosya için ;yapar. kullanma-exec aslında daha doğru kullanmaktan daha xargs. Lütfen lsargüman listesi boş olsa bile bir şey yapmak gibi komutların chmod, yetersiz argümanlar varsa gibi komutların hata verdiğini unutmayın. Ne demek istediğimi görmek için sadece herhangi bir shell script olmayan bir dizinde aşağıdaki komutu deneyin: find /path/to/dir -name '*.sh' -print0 | xargs -0 chmod 755. Bu bir karşılaştırın: find /path/to/dir -name '*.sh' -exec chmod 755 '{}' '+'.
Siu Ching Pong -Asuka Kenji-

2
@Vlad: Ayrıca, grepdışarı çıkmak .svnda iyi bir fikir değil. İken finddosya özelliklerini işlemek için uzmanlaşmıştır, grepyapmaz. Örneğinizde , '.svn.txt' adlı bir dosya da egrepkomutunuz tarafından filtrelenecektir . Normal ifadenizi '^ / \. Svn $' olarak değiştirebilmenize rağmen , bunu yapmak hala iyi bir uygulama değildir. -pruneYüklemi findmükemmel (dosya adı veya oluşturma zaman damgası, ya da her türlü koşul sağladığınız tarafından) bir dosya filtreleme için işler. Büyük bir kılıç kullanarak bir hamamböceği öldürebilirseniz bile, bunun önerilen yol olduğu anlamına gelmez :-).
Siu Ching Pong -Asuka Kenji-

3
Git'e geçmek bu sorunu çözdü (diğerleri arasında). Yalnızca çalışma kopyasının kökünde bir .git klasörü yapar, SVN gibi her klasörde değil. Ayrıca, .git klasörü, gerçek dosyalarınızla aynı adlarla karıştırılacak düz dosyalar içermez.
Tronic

3
2Dan Kalıplama: svn 1.7 sadece tek bir üst düzey .svn dizini oluşturur
ccpizza

Yanıtlar:


65

Arama için ack'a bakmanızı önerebilir miyim ? Bu bir kaynak kodunun farkındadır findve bu nedenle, yukarıdaki gibi kaynak kodu depo bilgileri de dahil olmak üzere birçok dosya türünü otomatik olarak yok sayar.


3
Ben ackçok seviyorum , ama find -type f -name "*.[ch]" | xargs grepbüyük bir kod tabanı ile uğraşırken daha önemli ölçüde yavaş bulduk .
John Ledbetter

63
John, ben ack'in yazarıyım ve bana ack ve grep'in hız problemlerinin ayrıntılarını verebilirsen, bunu takdir ediyorum. Bulduğum tüm durumlarda tamamen karşılaştırılabilirlerdi. Ya github.com/petdance/ack/issues adresinden haber verin ya da petdance.com adresinden andy adresine e-posta gönderin. Thansk.
Andy Lester

63
Çocuklar, bu bir ipucu, ama kesinlikle sorunun cevabı değil! :)
dolzenko

8
Is not ackdaha iyi bir şekilde fatura grep, bir kaynak farkında değil find? Değiştirmek için kullanmanın bazı örnekleri bunu findgerçek bir cevap haline getirecektir.
michiakig

3
Sorduğunu bilmediği soruya bir cevap. =)
Frungi

293

neden sadece

find . -not -iwholename '*.svn*'

-Not yüklemi, yolun herhangi bir yerinde .svn olan her şeyi reddeder.

Yani senin durumunda

find -not -iwholename '*.svn*' -name 'messages.*' -exec grep -Iw uint {} + \;

5
"-Not" ve "-iwholename" için süper büyük +1. Ack harika ve ben kullanıyorum, ama find / exec hala kullanımları vardır.
David Blevins

9
Asıl soruyu cevaplayan tek yanıt.
Brendon Crawford

14
Öğemden çıktım ve bu yorum için eleştirileceğime eminim, ama görünüşe göre -not ve -wholename POSIX uyumlu değil. Kullandım ! -iwholename yerine -not ve -path yerine aynı sonuçları aldı. Adam sayfalarıma göre (Ubuntu 12.04) bu sözdizimi POSIX uyumlu.
John

1
@whaley Önce söyledin '*.svn*'ama sonra '*.svn'. Hangisi doğru? Her ikisi de işe yarıyor mu? Sanırım muhtemelen olmalı '*.svn*'?
Keith M

1
@KeithM büyük yakalamak aslında. Bu cevap yıllardır burada oturuyor ve şimdiye kadar kimsenin bunu yakaladığını sanmıyorum.
whaley

141

Aşağıdaki gibi:

find . -path '*/.svn*' -prune -o -print

Alternatif olarak, bir yol önekine değil bir dizine dayalı olarak:

find . -name .svn -a -type d -prune -o -print

14
@Kaleb: Merhaba. Öneririm find . -type d -name .svn -prune -o -printçünkü biraz daha hızlı. POSIX standardına göre , ifadeler belirtilen sırayla tek tek değerlendirilir. İçindeki ilk ifade -aise false, ikinci ifade değerlendirilmez ( kısa devre ve değerlendirme olarak da adlandırılır ).
Siu Ching Pong -Asuka Kenji-

2
@Kaleb: Karşılaştırma olarak bir dosya tipi (biraz bir tamsayı yer olup olmadığını test etmek için eşdeğeri) daha hızlı bir karşılaştırma daha dosya (O (n) olan bir dizi karşılaştırma eşdeğer), koyarak -type dönce -name .svnteorik olarak daha etkilidir. Ancak, çok çok büyük bir dizin ağacınız olması dışında genellikle önemsizdir.
Siu Ching Pong -Asuka Kenji-

5
@ SiuChingPong-AsukaKenji- hayır, yalnızca dosya adını karşılaştırmak daha hızlıdır çünkü -type her dosyada bir stat (2) çağrısı gerektirir. Ancak dosya adı, readdir (3) yanıtının bir parçasıdır.
hraban

3
@JonathanHartley -printSon ifadenin parçası olarak eksik . Gibi bir şey find . -name .git -prune -o \( -type f -name LICENSE -print \)beklendiği gibi çalışır.
sschuberth

1
Hem .git hem de .svn'yi yok saymak ve diğer dizinleri listelemek istiyorsanız find . -name .svn -prune -o -name .git -prune -o -type d -print,. İkisinden -type dönce birkaç milisaniye daha hızlı olabilir -name, ancak ekstra yazmaya değmez.
JPaget

34

Göz ardı etmek .svn, .gitve (bir nokta ile başlayan) diğer gizli dizinleri, deneyin:

find . -type f -not -path '*/\.*'

Ancak, kullanım amacı finddosyalar içinde arama yapmaksa, şu komutları kullanmayı deneyebilirsiniz:

  • git grep - Git deposundaki kalıpları aramak için özel olarak tasarlanmış komut.
  • ripgrep- varsayılan olarak gizli dosyaları ve içinde belirtilen dosyaları yok sayar .gitignore.

İlgili: Linux'ta belirli metin içeren tüm dosyaları nasıl bulurum?


En iyi cevap imo. Diğerleri basit soruya cevap vermeyen şeyleri açıklamaya çalışırlar.
Anthony

19

İşte senin durumunda ne yapacağım:

find . -path .svn -prune -o -name messages.* -exec grep -Iw uint {} +

Emacs'ın rgrepyerleşik komutu .svndizini ve bir gerçekleştirirken muhtemelen ilgilenmediğiniz daha birçok dosyayı yok sayar find | grep. Varsayılan olarak ne kullanır:

find . \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS \
          -o -path \*/.svn -o -path \*/.git -o -path \*/.hg -o -path \*/.bzr \
          -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) \
     -prune -o \
       \( -name .\#\* -o -name \*.o -o -name \*\~ -o -name \*.bin -o -name \*.lbin \
          -o -name \*.so -o -name \*.a -o -name \*.ln -o -name \*.blg \
          -o -name \*.bbl -o -name \*.elc -o -name \*.lof -o -name \*.glo \
          -o -name \*.idx -o -name \*.lot -o -name \*.fmt -o -name \*.tfm \
          -o -name \*.class -o -name \*.fas -o -name \*.lib -o -name \*.mem \
          -o -name \*.x86f -o -name \*.sparcf -o -name \*.fasl -o -name \*.ufsl \
          -o -name \*.fsl -o -name \*.dxl -o -name \*.pfsl -o -name \*.dfsl \
          -o -name \*.p64fsl -o -name \*.d64fsl -o -name \*.dx64fsl -o -name \*.lo \
          -o -name \*.la -o -name \*.gmo -o -name \*.mo -o -name \*.toc \
          -o -name \*.aux -o -name \*.cp -o -name \*.fn -o -name \*.ky \
          -o -name \*.pg -o -name \*.tp -o -name \*.vr -o -name \*.cps \
          -o -name \*.fns -o -name \*.kys -o -name \*.pgs -o -name \*.tps \
          -o -name \*.vrs -o -name \*.pyc -o -name \*.pyo \) \
     -prune -o \
     -type f \( -name pattern \) -print0 \
     | xargs -0 -e grep -i -nH -e regex

Çoğu sürüm kontrol sistemi tarafından oluşturulan dizinleri ve birçok programlama dili için oluşturulan dosyaları yok sayar. Bu komutu çağırır diğer ad oluşturma ve değiştirme olabilir findve grepözel sorunları için kalıpları.


12

GNU bul

find .  ! -regex ".*[/]\.svn[/]?.*"

PHP işlemek için bir dizinin içine dizin yolları yüklüyordu. Diğer cevaplar daha yüksek (her ne nedenle olursa olsun) bulmaya (filtrelenmesine rağmen -type d) dosyaları filtrelemedi - bu cevap yaptı. +1
be hollenbeck

11

Bu amaçla grep kullanıyorum. Bunu ~ / .bashrc'nize koyun

export GREP_OPTIONS="--binary-files=without-match --color=auto --devices=skip --exclude-dir=CVS --exclude-dir=.libs --exclude-dir=.deps --exclude-dir=.svn"

grep bu seçenekleri çağırmada otomatik olarak kullanır


1
'Grep'in sadece bir veya iki yıl önce' --exclude-dir 'seçeneğini kazandığını belirtmek gerekir. Son Linux dağıtımları buna dahildir, ancak doğru hatırlarsam OSX'de kendi grepimi derlemeliydim (veya homebrew'dan bunu yapmasını istedim).
Jonathan Hartley

Ben bunun küçük bir varyantını kullanıyorum. Benim .bashrc bir Bash işlevi 'grp' oluşturur GREP_OPTIONS=xxx grep "$@". Bu, GREP_OPTIONS değişkeninin yalnızca 'grp' kullanarak manuel olarak çalıştırdığım grep örnekleri için ayarlandığı anlamına gelir. Bu, hiçbir zaman bir aracı çalıştırdığım bir durum elde edemediğim ve dahili olarak grep dediği anlamına gelir, ancak grep beklendiği gibi davranmadığı için araç karışır. Ayrıca, 'grp' çağıran, ancak --include=*.pysadece Python dosyalarını aramak için ekleyen ikinci bir işlev olan 'grpy' var .
Jonathan Hartley

Aslında, yansıma üzerine, benim yolumda yapmak artık hiç GREP_OPTIONS kullanmaya gerek yok. Şimdi sadece bir kabuk fonksiyonu 'grp' var grep --exclude=tags --exclude_dir=.git ...etc... "$@". Bunun 'ack' gibi çalışmasını seviyorum, ama ne yaptığının farkındalığını ve kontrolünü elimde tutuyorum.
Jonathan Hartley

9

find . | grep -v \.svn


Normal ifade .içinde kaçmak zorunda .svn.
vladr

4
Grep ile sabitlenmiş dizeleri kullanın : | fgrep -v /.svn/veya `| grep -F -v / .svn / ` adlarının bir parçası olarak" .svn "içeren dosyaları değil, dizini tam olarak hariç tutmak için.
Stephen P

8

Neden kolayca anlaşılabilir grep ile komutunuzu vermiyorsunuz:

your find command| grep -v '\.svn'

Normal ifade .içinde kaçmak zorunda .svn.
vladr

@ Şüphenin gölgesi olmadan Ylian; bunu yapmazsanız, 'tsvn', '1svn', 'asvn' vb. dizinler '' den beri dikkate alınmaz. regexp joker karakteridir: 'herhangi bir karakteri eşleştir'.
vladr

Pekala, bunun sadece -E ve -G için olacağını düşündüm. Sadece test ettim, kötüyüm. :(
yclian

2
Bu yanıtı seviyorum çünkü kavramsal olarak diğerlerinden daha basit. 'Bul' kullanımı için saçma sözdizimini hatırlayamıyorum, ancak birçok durumda kullanıldığı için grep -v'nin nasıl kullanılacağını kesinlikle hatırlayabiliyorum.
mattismyname

8

Şu adla bir komut dosyası oluşturun ~/bin/svnfind:

#!/bin/bash
#
# Attempts to behave identically to a plain `find' command while ignoring .svn/
# directories.

OPTIONS=()
PATHS=()
EXPR=()

while [[ $1 =~ ^-[HLP]+ ]]; do
    OPTIONS+=("$1")
    shift
done

while [[ $# -gt 0 ]] && ! [[ $1 =~ '^[-(),!]' ]]; do
    PATHS+=("$1")
    shift
done

# If user's expression contains no action then we'll add the normally-implied
# `-print'.
ACTION=-print

while [[ $# -gt 0 ]]; do
    case "$1" in
       -delete|-exec|-execdir|-fls|-fprint|-fprint0|-fprintf|-ok|-print|-okdir|-print0|-printf|-prune|-quit|-ls)
            ACTION=;;
    esac

    EXPR+=("$1")
    shift
done

if [[ ${#EXPR} -eq 0 ]]; then
    EXPR=(-true)
fi

exec -a "$(basename "$0")" find "${OPTIONS[@]}" "${PATHS[@]}" -name .svn -type d -prune -o '(' "${EXPR[@]}" ')' $ACTION

Bu komut dosyası düz bir findkomutla aynı şekilde davranır, ancak budanır.svn dizinleri . Aksi takdirde davranış aynıdır.

Misal:

# svnfind -name 'messages.*' -exec grep -Iw uint {} +
./messages.cpp:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
./messages.cpp:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
./messages.cpp:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
./messages.cpp:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
./messages.cpp:        for (uint i = 0; i < 10 && !_stopThreads; ++i) {
./virus/messages.cpp:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
./virus/messages.cpp:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
./virus/messages.h:    void _progress(const std::string &fileName, uint scanCount);
./virus/messages.h:    ProgressMessage(const std::string &fileName, uint scanCount);
./virus/messages.h:    uint        _scanCount;

Bu komut dosyası beklediğim gibi çalışmıyor. "Svnfind -type f" ile çalıştırırken, svn-dizinlerini ve svn-dizinlerindeki dosyaları da yazdırır
Ingo Fischer

@ ifischer echofind komutuna bir ekleyebilir ve hangi komutun yürütüldüğünü söyleyebilir misiniz? svnfind -type fRed Hat makinemde harika çalışıyor.
John Kugelman

Tamam yani işletim sistemine bağımlı görünüyor. Debian Squeeze (Ubuntu'da aynı) çalıştırıyorum. "Bir yankı ekle" ile ne demek istediğini anlamıyorum?
Ingo Fischer

@ ifischer Son satırı echo find "${OPTIONS[@]}"..., gerçekte çalıştırmak yerine find komutunu yazdıracak şekilde değiştirin .
John Kugelman

Tamam, son satırı olarak değiştirdi echo find ${OPTIONS[@]} ${PATHS[@]} -name .svn -type d -prune -o ( ${EXPR[@]} ) $ACTION, Bu bana şu çıktıyı verir:find -type f -name .svn -type d -prune -o ( -true ) -print
Ingo Fischer

5

Sadece Kaleb'in ve diğerlerinin mesajlarına ( seçeneğin , komutların vb. Kullanımını ayrıntılı olarak içeren) basit bir alternatif ekleyeceğimi düşündüm . Bu, özellikle soruda (ve diğer benzer kullanımlarda) tanımladığınız kullanıma uygulanabilir :find -pruneackrepofind

  1. Performans için, her zaman kullanmaya çalışmalısınız find ... -exec grep ... +(teşekkürler Kenji bu out işaret için) veya find ... | xargs egrep ...(taşınabilir) veya find ... -print0 | xargs -0 egrep ...(; boşluk içeren dosya isimleri üzerinde çalışmalarını GNU) yerine aitfind ... -exec grep ... \; .

    find ... -exec ... +Ve find | xargsformu çatal değil egrepsonuçlanan bir anda dosyaların bir demet için oldukça her dosya için, ama çok daha hızlı yürütülmesi .

  2. Kullanırken find | xargsformunu da kullanabilirsiniz greperik kolayca ve hızlı bir şekilde .svn(ya da herhangi bir dizin veya normal ifade), yani find ... -print0 | grep -v '/\.svn' | xargs -0 egrep ...(yararlı bir şey Hızlı ihtiyacınız ve nasıl kurulacağı hatırlamak rahatsız olamaz zaman find's-prune mantığını.)

    find | grep | xargsYaklaşım GNU benzer findbireyin -regex(bkz seçeneği ghostdog74adlı kullanıcının yayını), ancak (will GNU platformlarda çalışma daha taşınabilir findkullanılamaz.)


1
@Vlad: Lütfen ihbar için iki biçimi vardır -execanahtar find: biriyle sona eriyor; diğeriyle sona eriyor +. İle biten dosya, eşleşen tüm dosyaların bir listesiyle +değiştirilir {}. Ayrıca, normal '/\.svn'ifadeniz de dosya adlarına benzer '.svn.txt'. Daha fazla bilgi için lütfen soruya yaptığım yorumlarıma bakın.
Siu Ching Pong -Asuka Kenji-

2
@Vlad: İşte için POSIX standardıdır findfayda. Lütfen -exec:-) bölümüne bakın .
Siu Ching Pong -Asuka Kenji-

4

Bir kaynak kodu deposunda, genellikle yalnızca metin dosyalarına bir şeyler yapmak istiyorum.

İlk satır, CVS, SVN ve GIT veri havuzu dosyaları hariç tüm dosyalardır.

İkinci satır tüm ikili dosyaları hariç tutar.

find . -not \( -name .svn -prune -o -name .git -prune -o -name CVS -prune \) -type f -print0 | \
xargs -0 file -n | grep -v binary | cut -d ":" -f1

3

-Not -path seçenekleriyle find komutunu kullanıyorum. Erik ile iyi şansım olmadı.

find .  -name "*.groovy" -not -path "./target/*" -print

hedef dizin yolunda olmayan harika dosyaları bulur.


3

Bu sorunu gidermek için, bu bulma koşulunu kullanabilirsiniz:

find \( -name 'messages.*' ! -path "*/.svn/*" \) -exec grep -Iw uint {} +

Bunun gibi daha fazla kısıtlama ekleyebilirsiniz:

find \( -name 'messages.*' ! -path "*/.svn/*" ! -path "*/CVS/*" \) -exec grep -Iw uint {} +

Bununla ilgili daha fazla bilgiyi "Operatörler" kılavuz sayfasında bulabilirsiniz: http://unixhelp.ed.ac.uk/CGI/man-cgi?find


3

Eğer yaparsanız

find . -type f -name 'messages.*'

o -printzaman tüm ifade ( -type f -name 'messages.*') doğru olduğunda ima edilir , çünkü 'eylem' (gibi -exec) yoktur.

Bununla birlikte, belirli dizinlere inmeyi durdurmak için, bu dizinlerle eşleşen herhangi bir şey kullanmalı ve onu izlemelisiniz -prune(dizinlere inmeyi durdurmayı amaçlayan); şöyle:

find . -type d -name '.svn' -prune

Bu , .svn dizinleri için True olarak değerlendirilir ve bunu -o(VEYA) ile izleyerek boole kısa devresini kullanabiliriz , bundan sonra -oyalnızca ilk bölüm Yanlış olduğunda denetlenir, dolayısıyla bir .svn dizini değildir . Başka bir deyişle, aşağıdakiler:

find . -type d -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}

Sadece hakkın ne olduğunu evalute olacak -oyani -name 'message.*' -exec grep -Iw uint {}DEĞİL içindeki dosyaların .svn dizinleri için.

Çünkü Not .svn'iletiyi *' olasılıkla her zaman bir dizin (ve örneğin bir dosya), ve bu durumda kesinlikle isim eşleşen değil mi, siz de dışarıda bırakın olabilir -type dve yapın:

find . -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}

Son olarak, herhangi bir eylemi atlarsanız ( -execbir eylemdir), şöyle söyleyin:

find . -name '.svn' -prune -o -name 'message.*'

Daha sonra -printeylem ima ancak dahil BÜTÜN ifade uygulanacaktır -name '.svn' -prune -oparçası ve böylece yanı sıra tüm .svn dizinleri yazdırmak 'mesajının. *' dosyalarını, ne istediğinizi muhtemelen olmadığı. Bu nedenle -prune, bu şekilde kullanırken her zaman boole ifadesinin sağ tarafında bir 'eylem' kullanmalısınız . Ve bu eylem yazdırılırken açıkça eklemeniz gerekir, şöyle:

find . -name '.svn' -prune -o -name 'message.*' -print



2

wcfind .svn dizinlerini otomatik olarak kaldırmak için kullandığım bir bulma sarmalayıcı komut dosyasıdır.


1

Bu benim için Unix isteminde işe yarıyor

gfind. \ (-not -wholename '* \. svn *' \) -tip f -adı 'iletileri. *' -exec grep -Iw uint {} +

Yukarıdaki komut .svn ile olmayan DOSYALARI listeleyecek ve bahsettiğiniz grep'i yapacak.


'gfind' bir yazım hatası mı? Ubuntu 14.04'te yok.
Jonathan Hartley

'Bul' demek istediğinizi varsayarsak, bu pek işe yaramaz. Ayrıca,xxx.svnxxx . Bu önemlidir - örneğin, svn yerine git kullanıyorsanız, genellikle bulucunun sonuçlarına .gitignore (meta veri değil, depoya dahil edilen normal bir dosyadır) gibi dosyaları dahil etmek istersiniz.
Jonathan Hartley

1

i .svn kaldırma genellikle grep ile bir kez daha çıkış boru, benim kullanımımda çok yavaş değil. tipik örnek:

find -name 'messages.*' -exec grep -Iw uint {} + | grep -Ev '.svn|.git|.anythingElseIwannaIgnore'

VEYA

find . -type f -print0 | xargs -0 egrep messages. | grep -Ev '.svn|.git|.anythingElseIwannaIgnore'

0

'*' İle arama yapmayı söylerseniz, kökteki tüm "nokta dosyalarını" atlar:

find *

veya yolla

find /path/*

Bu, sorunun kesin / mükemmel bir çözümü değildir. Ancak, birkaç çözüm bundan daha basittir. Performans da harika, çünkü gizli dizinlere bile girmiyor.

eksiklikler:

  • iç içe "nokta dosyalarını" işlemez.
  • yalnızca ".git" ve ".svn" değil, tüm "nokta dosyaları" yok sayılır.

Örneğin, örneğinizde bir yıldız eklemek ihtiyacınız olan tek değişikliktir:

find * -name 'messages.*' -exec grep -Iw uint {} +
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.