Ben sık sık find
kaynak 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 uint
katları messages.h
ve messages.cpp
dosyalar:
# 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 find
yoksaymayı 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.
.svn
Subversion 1.7 çalışan kopyaların her dizindeki bir dizin yerine , çalışan kopyanın.svn
kö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.
-exec
ile +
çatal değil grep
onu kullanırken, her dosya için ;
yapar. kullanma-exec
aslında daha doğru kullanmaktan daha xargs
. Lütfen ls
argü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 '{}' '+'
.
grep
dışarı çıkmak .svn
da iyi bir fikir değil. İken find
dosya özelliklerini işlemek için uzmanlaşmıştır, grep
yapmaz. Örneğinizde , '.svn.txt' adlı bir dosya da egrep
komutunuz tarafından filtrelenecektir . Normal ifadenizi '^ / \. Svn $' olarak değiştirebilmenize rağmen , bunu yapmak hala iyi bir uygulama değildir. -prune
Yüklemi find
mü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 :-).
find ... -print0 | xargs -0 egrep ...
yerine kullanmayı deneyinfind ... -exec grep ...
(grep
her dosya için çatal değil , aynı anda bir grup dosya için). Bu formu.svn
kullanarak,-prune
bulma seçeneğini kullanmadan dizinleri defind ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...