मैं अक्सर findस्रोत कोड के माध्यम से खोज करने के लिए कमांड का उपयोग करता हूं , फाइलें हटाता हूं , जो भी हो। सावधानी से, क्योंकि सबवर्सन अपनी .svn/text-base/निर्देशिका में प्रत्येक फ़ाइल के डुप्लिकेट को संग्रहीत करता है मेरी सरल खोजों को बहुत सारे डुप्लिकेट परिणाम मिलते हैं। उदाहरण के लिए, मैं uintएकाधिक messages.hऔर messages.cppफ़ाइलों में पुन: खोज करना चाहता हूं :
# 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;
मैं निर्देशिकाओं findको अनदेखा करने के लिए कैसे कह सकता हूं .svn?
अद्यतन : यदि आप अपने SVN क्लाइंट को संस्करण 1.7 में अपग्रेड करते हैं तो यह कोई समस्या नहीं है।
सबवर्सन 1.7 में पेश किए गए परिवर्तनों की एक प्रमुख विशेषता एक ही स्थान में काम करने वाले मेटाडेटा भंडारण का केंद्रीकरण है।
.svnकार्यशील प्रति में प्रत्येक निर्देशिका में एक निर्देशिका के बजाय , सबवर्सन 1.7 की कार्यशील प्रतियों में कार्य.svnनिर्देशिका की जड़ में सिर्फ एक निर्देशिका है। इस निर्देशिका में (अन्य बातों के अलावा) एक SQLite- समर्थित डेटाबेस जिसमें उस कार्यशील प्रतिलिपि के सभी मेटाडेटा सबवर्सन की आवश्यकता है।
-execके साथ +कांटा नहीं है grepप्रत्येक फ़ाइल के लिए है, जबकि इसके साथ का उपयोग कर ;करता है। उपयोग करना -execवास्तव में उपयोग करने से अधिक सही है xargs। कृपया ध्यान दें कि lsतर्क सूची खाली होने पर भी कुछ ऐसा करते हैं, जबकि chmodअपर्याप्त तर्क होने पर कमांड जैसी त्रुटि देता है। यह देखने के लिए कि मेरा क्या मतलब है, बस एक निर्देशिका में निम्नलिखित कमांड का प्रयास करें जिसमें कोई शेल स्क्रिप्ट नहीं है find /path/to/dir -name '*.sh' -print0 | xargs -0 chmod 755:। इस एक के साथ तुलना करें find /path/to/dir -name '*.sh' -exec chmod 755 '{}' '+':।
grepबाहर आईएनजी .svnएक अच्छा विचार भी नहीं है। जबकि findफ़ाइल गुणों से निपटने के लिए विशेष है, grepनहीं है। आपके उदाहरण में, '.svn.txt' नाम की एक फ़ाइल भी आपके egrepआदेश द्वारा फ़िल्टर की जाएगी । हालाँकि आप अपने रेगेक्स को '^ / \ _ svn $' में संशोधित कर सकते हैं , फिर भी ऐसा करना अच्छा अभ्यास नहीं है। -pruneके विधेय findपूरी तरह से (फ़ाइल नाम, या सृजन टाइमस्टैम्प, या जो कुछ भी हालत आप आपूर्ति से) एक फ़ाइल छानने के लिए काम करता है। यह वैसे ही है जैसे कि आप एक बड़ी तलवार का उपयोग करके तिलचट्टे को मार सकते हैं, इसका मतलब यह नहीं है कि ऐसा करने का सुझाव दिया गया है :-)।
find ... -print0 | xargs -0 egrep ...इसके बजाय का उपयोग करने का प्रयास करेंfind ... -exec grep ...(grepप्रत्येक फ़ाइल के लिए कांटा नहीं , लेकिन एक समय में फ़ाइलों का एक गुच्छा के लिए)। इस फ़ॉर्म का उपयोग करके आप खोज.svnके-pruneविकल्प का उपयोग किए बिना निर्देशिकाओं को भी prune कर सकते हैं, अर्थातfind ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...