বর্তমান ডিরেক্টরিতে ফাইলগুলি কীভাবে খুঁজে বের করব যা শব্দ ব্যবহার করে নাfoo
(ব্যবহার করে grep
)?
বর্তমান ডিরেক্টরিতে ফাইলগুলি কীভাবে খুঁজে বের করব যা শব্দ ব্যবহার করে নাfoo
(ব্যবহার করে grep
)?
উত্তর:
যদি আপনার গ্রেপের কাছে -L
(বা --files-without-match
) বিকল্প থাকে:
$ grep -L "foo" *
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
: ^)
-rL
-L
grep -L 'foo' -- *
মানটি হ'ল এই আদেশগুলির পরে দীর্ঘতর বিকল্পগুলি গ্রহণ করা নির্দেশগুলি --
এই বিন্দুর পরে আর কোনও বিকল্প নেই বলে নির্দেশ করে।
একবার দেখুন ack
। এটি .svn
স্বয়ংক্রিয়ভাবে আপনার জন্য বর্জন করে , আপনাকে পার্লকে নিয়মিত এক্সপ্রেশন দেয় এবং এটি একটি একক পার্ল প্রোগ্রামের একটি সহজ ডাউনলোড।
আপনি যা সন্ধান করছেন তার সমতুল্য হ'ল ack
:
ack -L foo
আপনি একা গ্রেপ দিয়ে এটি করতে পারেন (খুঁজে না পেয়ে)।
grep -riL "foo" .
এটি ব্যবহৃত পরামিতিগুলির ব্যাখ্যা grep
-L, --files-without-match
each file processed.
-R, -r, --recursive
Recursively search subdirectories listed.
-i, --ignore-case
Perform case insensitive matching.
আপনি যদি l
(নিম্নচক্রযুক্ত) ব্যবহার করেন তবে আপনি বিপরীতটি পাবেন (ম্যাচের ফাইলগুলি)
-l, --files-with-matches
Only the names of files containing selected lines are written
নিম্নলিখিত কমান্ডটি আমাকে সমস্ত ফাইল দেয় যা প্যাটার্ন ধারণ করে না foo
:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0
grep '0$'
10 লাইনের বহুগুণের সাথে ফাইলগুলিও মিলবে! আপনি প্রয়োজন grep ':0$'
লাইনের শেষে: '0' একটি সুনির্দিষ্ট জন্য চেক করতে শেষে। তারপরে আপনি কেবল শূন্য লাইন মেলে ফাইলগুলি পাবেন।
নিম্নলিখিত কমান্ডটি svn
সেকেন্ড ব্যবহার করে ফোল্ডারগুলি ফিল্টার করার জন্য অনুসন্ধানের প্রয়োজনীয়তা বাদ দেয় grep
।
grep -rL "foo" ./* | grep -v "\.svn"
আপনার আসলে প্রয়োজন হবে:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
সমস্যা
আমার একটি বড় প্রকল্পের রিফ্যাক্টর দরকার যা .phtml
ইনলাইন পিএইচপি কোড ব্যবহার করে এইচটিএমএল লিখতে ফাইলগুলি ব্যবহার করে। পরিবর্তে আমি গোঁফ টেমপ্লেট ব্যবহার করতে চাই । আমি এমন কোনও .phtml
গাইল সন্ধান করতে চাই যাতে স্ট্রিং থাকে না new Mustache
কারণ এগুলি এখনও নতুন করে লেখার প্রয়োজন।
সমাধান
find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
ব্যাখ্যা
পাইপের আগে:
অনুসন্ধান
find .
এই ডিরেক্টরি থেকে শুরু করে পুনরাবৃত্তভাবে ফাইলগুলি সন্ধান করুন
-iname '*.phtml'
ফাইলের নাম অবশ্যই থাকতে হবে .phtml
(এটি i
এটিকে কেস-সংবেদনশীল করে তোলে)
-exec 'grep -H -E -o -c 'new Mustache' {}'
grep
মিলিত প্রতিটি পথে কমান্ডটি চালান
grep
-H
সর্বদা আউটপুট লাইনের সাথে ফাইলের নাম শিরোনাম প্রিন্ট করুন।
-E
বর্ধিত নিয়মিত অভিব্যক্তি হিসাবে প্যাটার্নটির ব্যাখ্যা করুন (অর্থাত্ গ্রেপকে egrep হিসাবে আচরণ করতে বাধ্য করুন)।
-o
লাইনের কেবল মিলের অংশটি মুদ্রণ করে।
-c
কেবলমাত্র নির্বাচিত লাইনের একটি গণনা স্ট্যান্ডার্ড আউটপুটে লেখা হয়।
এটি আমাকে সমস্ত ফাইল পাথের সমাপ্তির একটি তালিকা দেবে .phtml
, যার new Mustache
মধ্যে প্রতিটিটিতে স্ট্রিংয়ের সংখ্যার সংখ্যা রয়েছে ।
$> find . -iname '*.phtml$' -exec 'grep -H -E -o -c 'new Mustache' {}'\;
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/orders.phtml:1
./app/MyApp/Customer/View/Account/banking.phtml:1
./app/MyApp/Customer/View/Account/applycomplete.phtml:1
./app/MyApp/Customer/View/Account/catalogue.phtml:1
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0
প্রথম পাইপ grep :0$
এই তালিকাটি ফিল্টার করে কেবল এতে শেষ হওয়া লাইনগুলি অন্তর্ভুক্ত করে :0
:
$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0
দ্বিতীয় পাইপটি কেবল sed 's/..$//'
প্রতিটি ফাইলের পাথ ছেড়ে প্রতিটি লাইনের চূড়ান্ত দুটি অক্ষর সরিয়ে দেয়।
$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml
./app/MyApp/Customer/View/Account/studio.phtml
./app/MyApp/Customer/View/Account/classadd.phtml
./app/MyApp/Customer/View/Account/orders-trade.phtml
আমার গ্রেপের কোনও-এল বিকল্প নেই। আমি এটি অর্জনের জন্য একান্ত চেষ্টা করি।
ধারণাগুলি হ'ল:
ডিফ ডিমান্ডের সাহায্যে 2 ডাম্প ফাইলের মধ্যে পার্থক্য তৈরি করুন।
grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt
grep * *.log | cut -c1-14 | uniq > txt2.txt
diff txt1.txt txt2.txt | grep ">"
diff
দুটি আউটপুট স্ট্রিমের মধ্যে আসলে একটি করতে পারেন (আমার মনে হয় আপনি কমান্ডগুলি বন্ধনী দিয়ে ঘিরেছেন, এবং সেখানে কোথাও একটি কোণ বন্ধনীও রয়েছে), যদি আপনার সিস্টেমগুলি এটি সমর্থন করে তবে আমার ধারণা প্রশ্নটি, যেহেতু এটি সমর্থন করে নাgrep -L
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
আপনি "ফাইন্ড" এর অধীনে ফিল্টার এবং "গ্রেপ-ভিডব্লিউই" এর আওতায় ব্যতীত স্ট্রিং উল্লেখ করতে পারেন। আপনার যদি পরিবর্তিত সময়েও ফিল্টার করতে হয় তবে অনুসন্ধানের জন্য এমটাইম ব্যবহার করুন।
@ টুকান দ্বারা মন্তব্য করা হয়েছে, -L
/ --files-without-matches
পতাকা সম্পর্কিত অ্যাগের জন্য একটি খোলা বাগ রিপোর্ট রয়েছে :
ত্রুটি প্রতিবেদনটিতে সামান্য অগ্রগতি হওয়ায়, যতক্ষণ না বাগটি সমাধান না করা হচ্ছে ততক্ষণ -L
নীচে উল্লিখিত বিকল্পটির উপর নির্ভর করা উচিত নয় । পরিবর্তে এই থ্রেডে উপস্থাপিত বিভিন্ন পদ্ধতি ব্যবহার করুন। বাগ প্রতিবেদনের জন্য মন্তব্যটির উদ্ধৃতি দেওয়া [আমার উপর জোর দেওয়া]:
এ সম্পর্কে কোন আপডেট?
-L
ফাইলের প্রথম লাইনে ম্যাচগুলি সম্পূর্ণ উপেক্ষা করে। দেখে মনে হচ্ছে এটি শীঘ্রই ঠিক করা যাচ্ছে না, পতাকাটি পুরোপুরি সরানো উচিত, কারণ এটি কার্যকরভাবে বিজ্ঞাপন হিসাবে কাজ করে না ।
এর শক্তিশালী বিকল্প হিসাবে grep
আপনি সিলভার সন্ধানকারী - আগ : ব্যবহার করতে পারেন
গতিতে ফোকাস সহ আককের অনুরূপ একটি কোড অনুসন্ধানের সরঞ্জাম।
এদিকে তাকালে man ag
আমরা -L
বা --files-without-matches
বিকল্পটি খুঁজে পাই :
... OPTIONS ... -L --files-without-matches Only print the names of files that don´t contain matches.
অর্থাত, বর্তমান ডিরেক্টরি থেকে মেলে না এমন ফাইলগুলির জন্য পুনরাবৃত্তভাবে অনুসন্ধান করতে foo
:
ag -L foo
মেলে না এমন ফাইলগুলির জন্য কেবল বর্তমান ডিরেক্টরি অনুসন্ধান করতে foo
, কেবল --depth=0
পুনরাবৃত্তির জন্য নির্দিষ্ট করুন:
ag -L foo --depth 0
-L
- বাগ github.com/ggreer/the_silver_searcher/issues/238
grep -irnw "filepath" -ve "pattern"
অথবা
grep -ve "pattern" < file
উপরের কমান্ডটি আমাদের ফলাফল দেবে কারণ -v অনুসন্ধান করা প্যাটার্নের বিপরীতটি খুঁজে পায়
-l
কেবল ফাইলের নাম মুদ্রণের বিকল্প যুক্ত করতে পারেন ; তবে এটি এখনও এমন কোনও ফাইলের নাম মুদ্রণ করে যাতে কোনও রেখা থাকে যা প্যাটার্নটি ধারণ করে না। আমি বিশ্বাস করি যে ওপি সেই ফাইলগুলি সন্ধান করতে চায় যাতে প্যাটার্নে কোনও লাইন থাকে না।
নিম্নোক্ত কমান্ড আপনাকে "foo" স্ট্রিংয়ের অন্তর্ভুক্ত রেখাগুলি ফিল্টার করতে সহায়তা করতে পারে।
cat file | grep -v "foo"
cat
।