পুনরাবৃত্তভাবে ফোল্ডারটি অনুসন্ধান করুন তবে এসএনএন সাবফোল্ডার বাদ দিন


10

আমি fooএসভিএন দ্বারা রক্ষণাবেক্ষণ করা একটি বৃহত ফাইল সিস্টেমে সমস্ত উপস্থিতি খুঁজে পেতে চাই তবে আমি কোনও .svnডিরেক্টরিতে থাকা কোনও কিছুর সাথে মিল রাখতে চাই না ।

আমি যখন করি তখনই আমি তাত্ক্ষণিক মিলগুলি পাই grep -l -e 'foo' *তবে যখন আমি চেষ্টা করি এবং grep -l -e 'foo' --exclude-dir=".svn"কমান্ডটি দিয়ে কেবল এসএসএনএন ডিরেক্টরিগুলি বাদ দিই ।

আমি কি ভুল করছি?

উত্তর:


11

--exclude-dirকমান্ড লাইনে ফাইলগুলি তালিকাভুক্ত করার প্রয়োজনটিকে সমর্থন করে না। আপনি "ঝুলন্ত" কারণ grepস্ট্যান্ডার্ড ইনপুটটির জন্য অপেক্ষা করছেন।

grep -l -e 'foo' --exclud-dir = "। এসএনএন" *

ডিফল্টরূপে বাদে এবং অনুরূপ ফোল্ডারগুলি (এবং আরও অনেকগুলি বৈশিষ্ট্য রয়েছে) এর জন্য অ্যাক ব্যবহার বিবেচনা করুন .svn


2
ক্লিনার যদি আপনি পরিবর্তন *করতে ., ক্ষেত্রে অন্যান্য লুকানো ফোল্ডারগুলি অনুসন্ধান করা উচিত।
কেভিন

অথবা সম্ভবত আপনি ব্যবহার করতে চান --recursive .যেমন ওপি ইতিমধ্যে গনুহ হয়েছে পরিবর্তে, এইজন্য grep
jw013

ব্যক্তিগতভাবে, আমার shopt -s dotglobবাশ *রয়েছে তাই ইতিমধ্যে বিন্দু ফাইল রয়েছে। -rদুর্দান্ত, তবে ackএটি ডিফল্টরূপেও করেন :)
খ্রিস্টীয়

5

আপনি আকৌ আগ্রহী হতে পারে । এটি পুনরাবৃত্ত অনুসন্ধান (এবং অন্যান্য গ্রেপ -জাতীয় ক্রিয়াকলাপ) করে এবং ডিফল্টরূপে .svn বা .git হিসাবে ডিরেক্টরি বাদ দেয় ।


এর অনুসরণ হিসাবে আমি বর্তমানে ব্যবহার করি agযা একই রকম তবে দ্রুত।
নটহাগো

2

grep --exclude-dir...সমাধান জরিমানা করা উচিত, কিন্তু অন্য উপায় দেখানোর জন্য, আপনার সাথে এটা করতে পারেন find'র -prune:

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

আপনি যদি আরও কিছু কার্যকর করতে চান তবে findসমভূমি থেকে ভাল grep -r:

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

1

আপনি যদি .svn কখনও ডিরেক্টরিতে গ্রেপ করতে না চান তবে $GREP_OPTIONSনীচের মত বাদ দিয়ে আপনি ভেরিয়েবলটি সেট করতে পারেন :

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

কেবল আপনার এই লাইনটি যুক্ত করুন .bashrcএবং আপনার পুনরাবৃত্ত গ্রেপগুলি আর কোনও .svnডিরেক্টরিতে প্রবেশ করবে না । অবশ্যই এটি আপনার সমৃদ্ধ হতে পারে:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"

1
আমি ব্যক্তিগতভাবে এটি একটি উপনামটি ব্যবহার করে করি যাতে আমি যদি এই ফোল্ডারগুলির মধ্যে আসলে অনুসন্ধানের প্রয়োজন হয় তবে আমি কেবলমাত্র ভেরিয়েবলটি আনসেট / বাতিল না করে খালি গ্রেপ ব্যবহার করতে পারি the এটি আমাকে এমন ফোল্ডারগুলির তালিকা বজায় রাখতে দেয় যা আমি সহজেই প্রসারিত করতে পারি এবং আরও টাইপিং না করে আমার ব্যাতিক্রমের তালিকায় স্বয়ংক্রিয়ভাবে যুক্ত হয়েছি।
ড্রাগন 788

এটি একটি ভাল পদ্ধতির। এটির সুবিধাটিও রয়েছে যে, যদি আপনাকে ফোল্ডারগুলিতে গ্রেপ করতে হয় তবে আপনি ভেরিয়েবল সেট করতে ভুলে যাবেন না। (এগুলি গ্রিপ করার জন্য আমার কখনই দরকার ছিল না)) তবে এই
মুহুর্তে টিবিএইচ

0

এখানেও একটি দুর্দান্ত সমাধান রয়েছে:

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

মূলত, সমস্ত ফাইল থেকে, /.svn/ এর সাথে মেলে এমন ছাঁটাই করুন এবং তারপরে, কেবল এইগুলি মুদ্রণ করুন / foo / এর সাথে মেলে। আমি এই সমাধানটিও পছন্দ করি কারণ আপনি ফলাফলগুলি সহজেই এলএস সহ ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি ব্যবহার করতে পারেন

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

পরিবর্তনের তারিখ অনুসারে বাছাই করা একটি তালিকা ভিউ দেখতে। এছাড়াও, আপনি যদি তাদের সাথে অন্য কিছু করতে চান (সেগুলি খুলুন, কার্যকর করুন, ইত্যাদি) ফলাফলের পুরো পথটি পেয়ে খুব ভাল (

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.