আমি প্রায়শই 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 ওয়ার্কিং কপির মূলটিতে.svn
root এই ডিরেক্টরিতে (অন্যান্য জিনিসের মধ্যে) একটি এসকিউএল-ব্যাকড ডাটাবেস অন্তর্ভুক্ত রয়েছে যা সেই ওয়ার্কিং কপির জন্য সমস্ত মেটাডেটা সাবভারশন প্রয়োজন 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 ...