.Svn ডিরেক্টরিগুলি উপেক্ষা করার জন্য আমি কীভাবে `find` পেতে পারি?


227

আমি প্রায়শই 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


4
পারফরম্যান্সের জন্য, find ... -print0 | xargs -0 egrep ...পরিবর্তে find ... -exec grep ...( grepপ্রতিটি ফাইলের জন্য কাঁটাচামচ করে না , তবে একসাথে একগুচ্ছ ফাইলের জন্য) ব্যবহার করার চেষ্টা করুন । এই ফর্মটি ব্যবহার করে আপনি .svnডিরেক্টরিগুলি -pruneঅনুসন্ধানের বিকল্পটি ব্যবহার না করেই ছাঁটাই করতে পারেন , যেমনfind ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...
ভ্লাদর

3
@Vlad: যতদূর আমি জানি, ব্যবহার -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 '{}' '+'
সিউ চিং পং-আসুকা কেনজি-

2
@ ভ্লাদ: পাশাপাশি, grepআউট আউট .svnকরাও খুব ভাল ধারণা নয় too যদিও findফাইল বৈশিষ্ট্য পরিচালনার জন্য বিশেষজ্ঞ, grepনা। আপনার উদাহরণে, '.svn.txt' নামের একটি ফাইলও আপনার egrepআদেশ দ্বারা ফিল্টার করা হবে । যদিও আপনি আপনার রেজেক্সকে '^ / \। Svn $' এ পরিবর্তন করতে পারেন , তবুও এটি করা ভাল অনুশীলন নয়। -pruneএর বিধেয় findপুরোপুরি (ফাইলের নাম, বা সৃষ্টি টাইমস্ট্যাম্প, অথবা যাই হোক না কেন শর্ত আপনি সরবরাহকৃত দ্বারা) একটি ফাইল ফিল্টারিং জন্য কাজ করে। এটি ঠিক এর মতোই যদি আপনি একটি বড় তরোয়াল ব্যবহার করে তেলাপোকা মারতে পারেন তবে এর অর্থ এটি নয় :-) করার প্রস্তাব দেওয়া উপায়।
সিউ চিং পং-আসুকা কেনজি-

3
গিতে স্যুইচ করা এই সমস্যাটি সমাধান করেছে (অনেকের মধ্যে)) কেবলমাত্র ওয়ার্কিং কপির মূলের উপর একটি .git ফোল্ডার তৈরি করে, এর প্রতিটি ফোল্ডারে এসভিএন এর মতো নয়। অতিরিক্তভাবে, .git ফোল্ডারে এমন সরল ফাইল নেই যা আপনার প্রকৃত ফাইলগুলির সাথে একই নামে বিভ্রান্ত হবে।
ট্রনিক

3
2 ড্যান ছাঁচনির্মাণ: এসএনএন 1.7 কেবলমাত্র একটি একক শীর্ষ স্তরের .এসভিএন ডিরেক্টরি তৈরি করে
সিসিপিজ্জা

উত্তর:


65

অনুসন্ধানের জন্য, আমি কি আপনাকে এসকে দেখার পরামর্শ দিতে পারি ? এটি একটি উত্স-কোড সচেতন find, এবং যেমন উপরের মত উত্স কোড সংগ্রহস্থল তথ্য সহ অনেক ফাইল প্রকার স্বয়ংক্রিয়ভাবে উপেক্ষা করবে।


3
আমি ackখুব পছন্দ করি তবে find -type f -name "*.[ch]" | xargs grepকোনও বৃহত কোডবেস নিয়ে কাজ করার চেয়ে আমি এটি যথেষ্ট ধীর হয়ে গেছে বলে মনে করেছি ।
জন লেডবেটার

63
জন, আমি এসির রচয়িতা এবং আপনি যদি আমাকে এসি বনাম গ্রেপের গতির সমস্যার বিবরণ দিতে পারেন তবে আমি এটির প্রশংসা করব। আমি খুঁজে পাওয়া সমস্ত ক্ষেত্রে এগুলি সম্পূর্ণ তুলনামূলক হয়েছে। হয় আমাকে github.com/petdance/ack/issuesজানাবেন বা পেট্যান্স ডট কম এন্ডিতে আমাকে ইমেল করুন। Thansk।
অ্যান্ডি লেস্টার

63
বলছি, একটি টিপ আছে, কিন্তু অবশ্যই প্রশ্নের উত্তর না! :)
ডলজনকো

8
ackবিল হিসাবে উত্সাহিত না grep, আরও ভাল হয় না find? এটি প্রতিস্থাপনের জন্য ব্যবহার করার কয়েকটি উদাহরণ এটিকে findআসল উত্তর দেবে।
মিছিয়াকিগ

3
এটি এমন প্রশ্নের উত্তর যা তিনি জানেন না যে তিনি জিজ্ঞাসা করছেন। =)
ফ্রুঙ্গি

293

কেন শুধু না

find . -not -iwholename '*.svn*'

-নটিকেট প্রাক-পথে যে কোনও জায়গায় .svn থাকা সমস্ত কিছুকে উপেক্ষা করে।

আপনার ক্ষেত্রে তাই হবে

find -not -iwholename '*.svn*' -name 'messages.*' -exec grep -Iw uint {} + \;

5
"-নোট" এবং "-হোয়োলনেম" এর জন্য সুপার বড় +1। আক আশ্চর্যজনক এবং আমি এটি ব্যবহার করি, তবে অনুসন্ধান / নির্বাহকের এখনও এর ব্যবহার রয়েছে।
ডেভিড ব্ল্যুইন্স

9
একমাত্র প্রতিক্রিয়া যা আসলে আসল প্রশ্নের উত্তর দিয়েছে।
ব্রেন্ডন ক্রফোর্ড

14
আমি আমার উপাদান থেকে দূরে আছি এবং আমি নিশ্চিত যে এই মন্তব্যের জন্য আমি সমালোচিত হব, তবে দৃশ্যত-নোট এবং -কেন্দ্রিক পোজিক্স-সম্মতিযুক্ত নয়। আমি ব্যবহার করতাম ! -নাথ এবং -পথের জায়গায় -Whollename এর জায়গায় এবং একই ফলাফল পেয়েছে। আমার ম্যান পৃষ্ঠাগুলি অনুসারে (উবুন্টু 12.04) এই বাক্য গঠনটি পসিক্স-সম্মতিযুক্ত।
জন

1
@ হোয়ালি আপনি '*.svn*'প্রথমে বলেছিলেন কিন্তু তারপর '*.svn'। যা সঠিক? দুটোই কি কাজ করে? আমি মনে করি এটি সম্ভবত হওয়া উচিত '*.svn*'?
কিথ এম

1
@ কিথম প্রকৃতপক্ষে দুর্দান্ত ক্যাচ। এই উত্তরটি এখানে বছরের পর বছর ধরে বসে আছে এবং আমি মনে করি না যে এখন পর্যন্ত কেউ এটি ধরেনি।
তিমি

141

নিম্নরূপ:

find . -path '*/.svn*' -prune -o -print

বা, বিকল্পভাবে একটি ডিরেক্টরি উপর ভিত্তি করে এবং একটি पथ উপসর্গ:

find . -name .svn -a -type d -prune -o -print

14
@ কালেব: হাই আমি পরামর্শ দিচ্ছি find . -type d -name .svn -prune -o -printকারণ এটি কিছুটা দ্রুত। পসিএক্স স্ট্যান্ডার্ড অনুসারে , নির্দিষ্ট ক্রমে এক্সপ্রেশনগুলি একে একে মূল্যায়ন করা হয়। প্রথম অভিব্যক্তি যদি -aহয় false, দ্বিতীয় অভিব্যক্তি মূল্যায়ন হবে না (নামেও শর্ট সার্কিট ও মূল্যায়ন )।
সিউ চিং পং-আসুকা কেনজি-

2
@Kaleb: তুলনা হিসাবে ফাইল টাইপ হয় (পরীক্ষার একটু একটি পূর্ণসংখ্যা সেট করা হয় কিনা সমতুল্য) দ্রুত তুলনা চেয়ে ফাইলের নাম (একটি স্ট্রিং তুলনা, যা হে (ঢ) হয় সমতুল্য), নির্বাণ -type dআগে -name .svnতাত্ত্বিক আরো কার্যকরী। তবে আপনার কাছে খুব বড় ডিরেক্টরি গাছ থাকলে তা সাধারণত নগণ্য।
সিউ চিং পং-আসুকা কেনজি-

5
@ সুইচিংপং-আসুকাঞ্জি- না, কেবলমাত্র ফাইলের সাথে তুলনা করা দ্রুততর কারণ -প্রকারের প্রতিটি ফাইলটিতে স্ট্যাট (2) কল প্রয়োজন। ফাইলের নামটি অবশ্য রিডির (3) প্রতিক্রিয়ার অংশ।
hraban

3
@ জোনাথান হার্টলি আপনি -printসর্বশেষ প্রকাশের অংশ হিসাবে অনুপস্থিত রয়েছেন । find . -name .git -prune -o \( -type f -name LICENSE -print \)প্রত্যাশার মতো কিছু কাজ করে।
স্কুবার্থ

1
আপনি যদি .git এবং .svn উভয়ই উপেক্ষা করতে চান এবং কেবল অন্য ডিরেক্টরিগুলি তালিকাবদ্ধ করতে পারেন find . -name .svn -prune -o -name .git -prune -o -type d -print,। -type dদু'টির আগে এটি কয়েক মিলি সেকেন্ড দ্রুত রেখে দেওয়া হতে পারে -nameতবে এটি অতিরিক্ত টাইপিংয়ের পক্ষে উপযুক্ত নয়।
জেপেজেট

34

উপেক্ষা করার .svn, .gitএবং অন্যান্য গোপন ডিরেক্টরি (ক ডট দিয়ে শুরু), দেখুন:

find . -type f -not -path '*/\.*'

তবে, যদি ব্যবহারের উদ্দেশ্য findফাইলগুলির মধ্যে অনুসন্ধান করা হয়, আপনি এই আদেশগুলি ব্যবহার করার চেষ্টা করতে পারেন:

  • git grep - গিট সংগ্রহস্থলের মধ্যে নিদর্শন অনুসন্ধানের জন্য বিশেষভাবে নকশা করা কমান্ড।
  • ripgrep- যা ডিফল্টরূপে নির্দিষ্ট করা লুকানো ফাইল এবং ফাইলগুলিকে উপেক্ষা করে .gitignore

সম্পর্কিত: লিনাক্সে সুনির্দিষ্ট পাঠ্যযুক্ত সমস্ত ফাইল কীভাবে খুঁজে পাব?


সেরা উত্তর ইমো। অন্যরা এমন বিষয়গুলি ব্যাখ্যা করার চেষ্টা করে যা সাধারণ প্রশ্নের উত্তর দেয় না।
অ্যান্টনি

19

আপনার ক্ষেত্রে আমি কী করব তা এখানে:

find . -path .svn -prune -o -name messages.* -exec grep -Iw uint {} +

ইমাসসের rgrepঅন্তর্নির্মিত কমান্ড .svnডিরেক্টরিটিকে উপেক্ষা করে এবং আরও অনেকগুলি ফাইল সম্ভবত আপনি যখন সম্পাদনা করছেন তখন আগ্রহী নন find | grep। এটি এটি ডিফল্ট হিসাবে ব্যবহার করে:

find . \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS \
          -o -path \*/.svn -o -path \*/.git -o -path \*/.hg -o -path \*/.bzr \
          -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) \
     -prune -o \
       \( -name .\#\* -o -name \*.o -o -name \*\~ -o -name \*.bin -o -name \*.lbin \
          -o -name \*.so -o -name \*.a -o -name \*.ln -o -name \*.blg \
          -o -name \*.bbl -o -name \*.elc -o -name \*.lof -o -name \*.glo \
          -o -name \*.idx -o -name \*.lot -o -name \*.fmt -o -name \*.tfm \
          -o -name \*.class -o -name \*.fas -o -name \*.lib -o -name \*.mem \
          -o -name \*.x86f -o -name \*.sparcf -o -name \*.fasl -o -name \*.ufsl \
          -o -name \*.fsl -o -name \*.dxl -o -name \*.pfsl -o -name \*.dfsl \
          -o -name \*.p64fsl -o -name \*.d64fsl -o -name \*.dx64fsl -o -name \*.lo \
          -o -name \*.la -o -name \*.gmo -o -name \*.mo -o -name \*.toc \
          -o -name \*.aux -o -name \*.cp -o -name \*.fn -o -name \*.ky \
          -o -name \*.pg -o -name \*.tp -o -name \*.vr -o -name \*.cps \
          -o -name \*.fns -o -name \*.kys -o -name \*.pgs -o -name \*.tps \
          -o -name \*.vrs -o -name \*.pyc -o -name \*.pyo \) \
     -prune -o \
     -type f \( -name pattern \) -print0 \
     | xargs -0 -e grep -i -nH -e regex

এটি বেশিরভাগ সংস্করণ নিয়ন্ত্রণ সিস্টেম দ্বারা নির্মিত ডিরেক্টরি এবং সেইসাথে অনেক প্রোগ্রামিং ভাষার জন্য উত্পন্ন ফাইলগুলি উপেক্ষা করে। আপনি এমন একটি উপাধি তৈরি করতে পারেন যা এই আদেশটি প্রেরণ করে এবং আপনার নির্দিষ্ট সমস্যার জন্য প্রতিস্থাপন findএবং grepনিদর্শনগুলি তৈরি করতে পারে।


12

জিএনইউ সন্ধান করুন

find .  ! -regex ".*[/]\.svn[/]?.*"

পিএইচপি প্রক্রিয়া করার জন্য আমি ডিরেক্টরি পাথগুলি একটি অ্যারেতে লোড করছিলাম। অন্যান্য উত্তরগুলি উচ্চতর (যাই হোক না কেন কারণেই) অনুসন্ধানগুলিতে (সত্ত্বেও -type d) ফাইলগুলি ফিল্টার করে নি - এই উত্তরটি করেছে। +1
হোলেনবেক

11

আমি এই উদ্দেশ্যে গ্রেপ ব্যবহার করি। এটি আপনার ~ / .bashrc এ রাখুন

export GREP_OPTIONS="--binary-files=without-match --color=auto --devices=skip --exclude-dir=CVS --exclude-dir=.libs --exclude-dir=.deps --exclude-dir=.svn"

অনুরোধে গ্রেপ স্বয়ংক্রিয়ভাবে এই বিকল্পগুলি ব্যবহার করে


1
এটি লক্ষণীয় যে 'গ্রেপ' বছর বা দু'বছর আগে কেবল '--exclud-dir' বিকল্পটি অর্জন করেছিল। সাম্প্রতিক লিনাক্স ডিস্ট্রিবিউশনগুলিতে এটি অন্তর্ভুক্ত রয়েছে, তবে আমি যদি সঠিকভাবে মনে করি তবে আমাকে ওএসএক্সে আমার নিজস্ব গ্রেপ (বা হোমব্রু বলার জন্য) সঙ্কলন করতে হয়েছিল।
জনাথন হার্টলি

আমি এর একটি ছোটখাটো রূপ ব্যবহার করি। আমার .bashrc একটি বাশ ফাংশন 'grp' তৈরি করে, যা হিসাবে সংজ্ঞায়িত করা হয় GREP_OPTIONS=xxx grep "$@"। এর অর্থ হ'ল GREP_OPTIONS ভেরিয়েবলটি কেবলমাত্র 'grp' ব্যবহার করে ম্যানুয়ালি সঞ্চালিত গ্রেপের উদাহরণগুলির জন্য সেট করা আছে। এর অর্থ আমি কখনই কোনও পরিস্থিতি পাই না যেখানে আমি কোনও সরঞ্জাম চালনা করি এবং অভ্যন্তরীণভাবে এটি গ্রেপকে ডাকে, কিন্তু সরঞ্জামটি বিভ্রান্ত হয়ে পড়ে কারণ গ্রেপ এটি প্রত্যাশিতভাবে আচরণ করছে না। এছাড়াও, আমার একটি দ্বিতীয় ক্রিয়াকলাপ রয়েছে 'গ্রপি', যা 'গ্রাপি' বলে ডাকে, তবে যুক্ত করে --include=*.py, কেবল পাইথন ফাইলগুলি অনুসন্ধান করতে।
জোনাথন হার্টলি

প্রকৃতপক্ষে, প্রতিচ্ছবিতে, আমার উপায়ে এটি করার জন্য এখন আর GREP_OPTIONS ব্যবহার করার দরকার নেই। আমার এখন সবেমাত্র একটি শেল ফাংশন রয়েছে 'জিআরপি' যা কল করে grep --exclude=tags --exclude_dir=.git ...etc... "$@"। আমি পছন্দ করি যে এটি 'আক্ক' এর মতো চলে, তবে আমি কী করছি তা সম্পর্কে সচেতনতা এবং নিয়ন্ত্রণ রক্ষা করি।
জোনাথন হার্টলি

9

find . | grep -v \.svn


আপনি অব্যাহতি আছে .মধ্যে .svnregexp।
ভ্লাদর

4
গ্রেপ : | fgrep -v /.svn/বা `| --ফিক্সড-স্ট্রিং ব্যবহার করুন grep -F -v / .svn / তাদের নামের অংশ হিসাবে ".svn" সহ ফাইলগুলি নয় ঠিক ডিরেক্টরি বাদ দিতে ।
স্টিফেন পি

8

আপনি সহজেই বোধগম্য এমন গ্রেপ দিয়ে আপনার কমান্ডটি কেন পাইপ করবেন না:

your find command| grep -v '\.svn'

আপনি অব্যাহতি আছে .মধ্যে .svnregexp।
ভ্লাদর

@ ইয়াইকিয়ান সন্দেহের ছায়া ছাড়াই; যদি আপনি এটি না করেন, তবে 'tsvn', '1svn', 'asvn' ইত্যাদি ডিরেক্টরিগুলিও '' উপেক্ষা করা হবে। এটি একটি রেজিপ্লেক্স ওয়াইল্ডকার্ড: 'যে কোনও চরিত্রের সাথে মেলে'।
ভ্লাদর

ঠিক আছে, আমি ভেবেছিলাম এটি কেবল-ই এবং-জি-র ক্ষেত্রেই ঘটবে। আমি ঠিক পরীক্ষা করেছি, আমার খারাপ। :(
yclian

2
আমি এই উত্তরটি পছন্দ করি কারণ এটি অন্যদের তুলনায় ধারণাগতভাবে সহজ। আমি 'ফাইন্ড' ব্যবহারের জন্য হাস্যকর সিনট্যাক্সটি মনে করতে পারি না তবে গ্রিপ-ভি কীভাবে ব্যবহার করা যায় তা আমি অবশ্যই মনে করতে পারি কারণ এটি অনেক পরিস্থিতিতে ব্যবহৃত হয় in
mattismyname

8

নামে একটি স্ক্রিপ্ট তৈরি করুন ~/bin/svnfind:

#!/bin/bash
#
# Attempts to behave identically to a plain `find' command while ignoring .svn/
# directories.

OPTIONS=()
PATHS=()
EXPR=()

while [[ $1 =~ ^-[HLP]+ ]]; do
    OPTIONS+=("$1")
    shift
done

while [[ $# -gt 0 ]] && ! [[ $1 =~ '^[-(),!]' ]]; do
    PATHS+=("$1")
    shift
done

# If user's expression contains no action then we'll add the normally-implied
# `-print'.
ACTION=-print

while [[ $# -gt 0 ]]; do
    case "$1" in
       -delete|-exec|-execdir|-fls|-fprint|-fprint0|-fprintf|-ok|-print|-okdir|-print0|-printf|-prune|-quit|-ls)
            ACTION=;;
    esac

    EXPR+=("$1")
    shift
done

if [[ ${#EXPR} -eq 0 ]]; then
    EXPR=(-true)
fi

exec -a "$(basename "$0")" find "${OPTIONS[@]}" "${PATHS[@]}" -name .svn -type d -prune -o '(' "${EXPR[@]}" ')' $ACTION

এই স্ক্রিপ্টটি প্লেইন findকমান্ডের সাথে একই রকম আচরণ করে তবে এটি .svnডিরেক্টরি ছাঁটাই করে দেয় । অন্যথায় আচরণটি অভিন্ন।

উদাহরণ:

# svnfind -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) {
./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;

এই স্ক্রিপ্টটি যেমনটি আশা করি তেমন কাজ করে না। এটি "এসএনএনফাইন্ড-টাইপ এফ" দিয়ে চালানোর সময়, এটি এসএনএন-ডিরেক্টরিগুলি এবং এসএনএন-ডিরেক্টরিতে থাকা ফাইলগুলিও প্রিন্ট করে
ইনগো ফিশার

@ ফিশার আপনি কি ফাইন্ড echoকমান্ডে একটি যুক্ত করতে পারেন এবং আমাকে বলতে পারেন কোন আদেশটি কার্যকর করা হয়েছে? svnfind -type fআমার রেড হ্যাট মেশিনে দুর্দান্ত কাজ করে।
জন কুগেলম্যান

ঠিক আছে তাই এটি ওএস নির্ভর বলে মনে হচ্ছে। আমি ডেবিয়ান স্কুইজ চালাচ্ছি (উবুন্টুতে এটি একই)) আমি বুঝতে পারছি না "ইকো যুক্ত" বলতে কী বোঝ?
ইনগো ফিশার

@ আইফিশার শেষ লাইনটি এতে পরিবর্তন করুন echo find "${OPTIONS[@]}"...যাতে এটি প্রকৃতপক্ষে চালানোর পরিবর্তে এটি অনুসন্ধান কমান্ডটি মুদ্রণ করে।
জন কুগেলম্যান

ঠিক আছে সর্বশেষ লাইনটি এতে পরিবর্তন হয়েছে echo find ${OPTIONS[@]} ${PATHS[@]} -name .svn -type d -prune -o ( ${EXPR[@]} ) $ACTION, এটি আমাকে নিম্নলিখিত ফলাফল দেয়:find -type f -name .svn -type d -prune -o ( -true ) -print
ইনগো ফিশার

5

ভেবেছিলাম আমি কালেব এবং অন্যের পোস্টের একটি সহজ বিকল্প যুক্ত করবো (যা find -pruneবিকল্পের ব্যবহার ack, repofindকমান্ডস ইত্যাদির বিস্তারিত বিশদ ) যা আপনার প্রশ্নে বর্ণিত ব্যবহারের (এবং অন্য কোনও অনুরূপ ব্যবহারের ক্ষেত্রে) বিশেষত প্রযোজ্য :

  1. অভিনয়ের জন্য, আপনি সবসময় ব্যবহার করতে চেষ্টা করা উচিত find ... -exec grep ... +অথবা (এই ইশারা জন্য ধন্যবাদ কেনজি) find ... | xargs egrep ...(পোর্টেবল) অথবা find ... -print0 | xargs -0 egrep ...; (কাজ শূণ্যস্থান ধারণকারী ফাইলের নামের উপর গনুহ) পরিবর্তে এর find ... -exec grep ... \;

    find ... -exec ... +এবং find | xargsফর্ম মাল না egrepএকটি সময়ে ফাইল একটি গুচ্ছ জন্য প্রতিটি ফাইলের জন্য, বরং, ফলে অনেক দ্রুত সম্পাদন

  2. ব্যবহার করার সময় find | xargsআপনি যে ফর্ম এছাড়াও ব্যবহার করতে পারেন grepসহজে এবং দ্রুত করতে খেজুর .svn(অথবা কোন ডিরেক্টরি বা রেগুলার এক্সপ্রেশন), অর্থাৎ find ... -print0 | grep -v '/\.svn' | xargs -0 egrep ...(দরকারী আপনি কিছু দ্রুত প্রয়োজন এবং কিভাবে সেট আপ মনে রাখবেন বিরক্ত করা যাবে না যখন findএর -pruneযুক্তিবিজ্ঞান।)

    find | grep | xargsপদ্ধতির গনুহ অনুরূপ find'র -regexবিকল্প (দেখুন ghostdog74এর পোস্টে), কিন্তু আরো পোর্টেবল হয় (এছাড়াও প্ল্যাটফর্মের যেখানে গনুহ কাজ করবে findপাওয়া যায় না।)


1
@ ভ্ল্যাড: দয়া করে লক্ষ্য করুন যে -execস্যুইচ ইন করার জন্য দুটি ফর্ম রয়েছে find: একটিতে সমাপ্ত হচ্ছে ;এবং অন্যটি শেষ হচ্ছে +। এক সাথে শেষ হওয়া সমস্ত মিলে যাওয়া ফাইলের একটি তালিকা দ্বারা +প্রতিস্থাপন {}করে। তদুপরি, আপনার রেজেক্স '/\.svn'ফাইলের নামের '.svn.txt'সাথেও মেলে । আরও তথ্যের জন্য দয়া করে প্রশ্নের মন্তব্যগুলিতে আমার মন্তব্যগুলি দেখুন।
সিউ চিং পং-আসুকা কেনজি-

2
@ ভ্লাদ: ইউটিলিটির জন্য এখানে পসিক্স মান find। দয়া করে -execঅংশটি দেখুন :-)।
সিউ চিং পং-আসুকা কেনজি-

4

উত্স কোডের সংগ্রহস্থলে, আমি সাধারণত জিনিসগুলি কেবল টেক্সট ফাইলগুলিতেই করতে চাই।

প্রথম লাইনটি সিভিএস, এসভিএন এবং জিআইটি সংগ্রহস্থল ফাইলগুলি বাদ দিয়ে সমস্ত ফাইল।

দ্বিতীয় লাইনে সমস্ত বাইনারি ফাইল বাদ দেওয়া হয়।

find . -not \( -name .svn -prune -o -name .git -prune -o -name CVS -prune \) -type f -print0 | \
xargs -0 file -n | grep -v binary | cut -d ":" -f1

3

আমি নথ-পাথ বিকল্পগুলি দিয়ে সন্ধান করি। আমি ছাঁটাই সঙ্গে ভাল ভাগ্য হয়নি।

find .  -name "*.groovy" -not -path "./target/*" -print

লক্ষ্য ডিরেক্টরি পথে নয় গ্রোভী ফাইলগুলি খুঁজে পাবেন।


3

এই সমস্যা সমাধানের জন্য, আপনি কেবল এই সন্ধান শর্তটি ব্যবহার করতে পারেন:

find \( -name 'messages.*' ! -path "*/.svn/*" \) -exec grep -Iw uint {} +

আপনি এই জাতীয় আরও বিধিনিষেধ যোগ করতে পারেন:

find \( -name 'messages.*' ! -path "*/.svn/*" ! -path "*/CVS/*" \) -exec grep -Iw uint {} +

ম্যান পৃষ্ঠা বিভাগে "অপারেটর" বিভাগে আপনি এই সম্পর্কে আরও তথ্য পেতে পারেন: http://unixhelp.ed.ac.uk/CGI/man-cgi?find


3

মনে রাখবেন আপনি যদি তা করেন

find . -type f -name 'messages.*'

তারপরেই -printবোঝানো হয় যখন সম্পূর্ণ এক্সপ্রেশন ( -type f -name 'messages.*') সত্য হয়, কারণ কোনও 'ক্রিয়া' (যেমন -exec) নেই।

কিছু নির্দিষ্ট ডিরেক্টরিতে অবতরণ বন্ধ করার জন্য, আপনাকে সেই ডিরেক্টরিগুলির সাথে মেলে এমন কিছু ব্যবহার করা উচিত এবং এটি অনুসরণ করুন -prune(যার উদ্দেশ্য ডিরেক্টরিতে নামা বন্ধ করা); তাই ভালো:

find . -type d -name '.svn' -prune

এই মূল্যায়ণ সত্য .svn ডিরেক্টরি জন্য, এবং আমরা এই অনুসরণ করে বুলিয়ান শর্ট সার্কিট ব্যবহার করতে পারেন -o(বা), যা পরে কি পরে অনুসরণ করে -oশুধুমাত্র পরীক্ষা করা হয় যখন প্রথম অংশ মিথ্যা হয়, অত: পর হয় না একটি .svn ডিরেক্টরি। অন্য কথায়, নিম্নলিখিত:

find . -type d -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}

শুধুমাত্র evalute হবে কি ঠিক -o, যথা -name 'message.*' -exec grep -Iw uint {}, ফাইল নয় ভিতরে .svn ডিরেক্টরি জন্য।

মনে রাখবেন যে .svnসম্ভবত সর্বদা একটি ডিরেক্টরি (এবং উদাহরণস্বরূপ কোনও ফাইল নয়) এবং এই ক্ষেত্রে অবশ্যই 'বার্তা। *' নামের সাথে মেলে না, আপনি সম্ভবত এই -type dকাজটি ছেড়ে যেতে পারেন:

find . -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}

সবশেষে মনে রাখবেন যে আপনি যদি কোনও ক্রিয়া বাদ দেন (তবে -execএটি একটি ক্রিয়া), তেমনভাবে বলুন:

find . -name '.svn' -prune -o -name 'message.*'

তারপরে -printঅ্যাকশনটি অন্তর্ভুক্ত করা হয়েছে তবে -name '.svn' -prune -oঅংশ সহ পুরো প্রকাশের ক্ষেত্রে প্রযোজ্য হবে এবং এইভাবে সমস্ত .svn ডিরেক্টরিগুলি পাশাপাশি 'বার্তা। *' ফাইলগুলি মুদ্রণ করবে যা সম্ভবত আপনি চান না। এইভাবে ব্যবহার করার সময় আপনার সর্বদা বুলিয়ান এক্সপ্রেশনটির ডানদিকে একটি 'ক্রিয়া' ব্যবহার করা উচিত -prune। এবং যখন এই ক্রিয়াটি মুদ্রণ করা হয় তখন আপনাকে এটিকে স্পষ্টভাবে যুক্ত করতে হবে:

find . -name '.svn' -prune -o -name 'message.*' -print



2

wcfind একটি অনুসন্ধানের মোড়ক স্ক্রিপ্ট যা আমি স্বয়ংক্রিয়ভাবে .svn ডিরেক্টরিগুলি অপসারণ করতে ব্যবহার করি।


1

এটি আমার জন্য ইউনিক্স প্রম্পটে কাজ করে

জিফাইন্ড -(-নাট-হোলোনেম '* \। এসএনএন *' \) -প্রকারের এফ-নাম 'বার্তাগুলি। *' -অনেক গ্রেপ -আপনি int} +

উপরের কমান্ডটি ফাইলগুলি তালিকাভুক্ত করবে যা .svn নয় এবং আপনার উল্লেখ করা গ্রেপটি করবে।


'জিফাইন্ড' কি টাইপো? আমার এটি উবুন্টু 14.04 এ নেই।
জোনাথন হার্টলি

ধরে নেওয়া আপনার অর্থ 'খুঁজে পাওয়া' বোঝায় এটি কার্যকর হয় না। এটি এর মতো ফাইলগুলিও ফিল্টার করে xxx.svnxxx। এটি গুরুত্বপূর্ণ - উদাহরণস্বরূপ আপনি যদি এসএনএন এর পরিবর্তে গিট ব্যবহার করছেন তবে আপনি প্রায়শই .gitignore (যা মেটাডেটা নয়, এটি একটি নিয়মিত ফাইল যা রেপোতে অন্তর্ভুক্ত থাকে) সন্ধানের ফলাফলগুলিতে অন্তর্ভুক্ত করতে চান।
জোনাথন হার্টলি

1

আমি সাধারণত। গ্রেভের অপসারণের সময় আরও একবার গ্রেপের মাধ্যমে আউটপুটটি পাইপ করি, আমার ব্যবহারে এটি খুব ধীর হয় না। সাধারণ উদাহরণ:

find -name 'messages.*' -exec grep -Iw uint {} + | grep -Ev '.svn|.git|.anythingElseIwannaIgnore'

অথবা

find . -type f -print0 | xargs -0 egrep messages. | grep -Ev '.svn|.git|.anythingElseIwannaIgnore'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.