আমি প্রায়শই 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?
আপডেট : আপনি যদি আপনার এসভিএন ক্লায়েন্টকে 1.7 সংস্করণে আপগ্রেড করেন তবে এটি আর সমস্যা নয়।
সাবভারশন ১.7 এ প্রবর্তিত পরিবর্তনের একটি মূল বৈশিষ্ট্য হ'ল ওয়ার্কিং কপি মেটাডেটা স্টোরেজকে একক স্থানে কেন্দ্রিয়করণ করা।
.svnওয়ার্কিং কপির প্রতিটি ডিরেক্টরিতে ডিরেক্টরি পরিবর্তে সাবভার্সন ১.7 ওয়ার্কিং কপির একটি মাত্র ডিরেক্টরি রয়েছে the ওয়ার্কিং কপির মূলটিতে.svnroot এই ডিরেক্টরিতে (অন্যান্য জিনিসের মধ্যে) একটি এসকিউএল-ব্যাকড ডাটাবেস অন্তর্ভুক্ত রয়েছে যা সেই ওয়ার্কিং কপির জন্য সমস্ত মেটাডেটা সাবভারশন প্রয়োজন ion
-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করাও খুব ভাল ধারণা নয় too যদিও findফাইল বৈশিষ্ট্য পরিচালনার জন্য বিশেষজ্ঞ, grepনা। আপনার উদাহরণে, '.svn.txt' নামের একটি ফাইলও আপনার egrepআদেশ দ্বারা ফিল্টার করা হবে । যদিও আপনি আপনার রেজেক্সকে '^ / \। Svn $' এ পরিবর্তন করতে পারেন , তবুও এটি করা ভাল অনুশীলন নয়। -pruneএর বিধেয় findপুরোপুরি (ফাইলের নাম, বা সৃষ্টি টাইমস্ট্যাম্প, অথবা যাই হোক না কেন শর্ত আপনি সরবরাহকৃত দ্বারা) একটি ফাইল ফিল্টারিং জন্য কাজ করে। এটি ঠিক এর মতোই যদি আপনি একটি বড় তরোয়াল ব্যবহার করে তেলাপোকা মারতে পারেন তবে এর অর্থ এটি নয় :-) করার প্রস্তাব দেওয়া উপায়।
find ... -print0 | xargs -0 egrep ...পরিবর্তেfind ... -exec grep ...(grepপ্রতিটি ফাইলের জন্য কাঁটাচামচ করে না , তবে একসাথে একগুচ্ছ ফাইলের জন্য) ব্যবহার করার চেষ্টা করুন । এই ফর্মটি ব্যবহার করে আপনি.svnডিরেক্টরিগুলি-pruneঅনুসন্ধানের বিকল্পটি ব্যবহার না করেই ছাঁটাই করতে পারেন , যেমনfind ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...