मैं अक्सर 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 ...