প্রদত্ত স্ট্রিং প্যাটার্ন না থাকা ফাইলগুলি কীভাবে আমি সন্ধান করব?


535

বর্তমান ডিরেক্টরিতে ফাইলগুলি কীভাবে খুঁজে বের করব যা শব্দ ব্যবহার করে নাfoo (ব্যবহার করে grep)?

উত্তর:


817

যদি আপনার গ্রেপের কাছে -L(বা --files-without-match) বিকল্প থাকে:

$ grep -L "foo" *

1
অন্য জায়গায় নির্দেশিত হিসাবে ack ডিফল্টরূপে .svn (subversion) ফাইল এড়াতে সহায়তা করে helps
গুরুম

11
@ গুরু এটি পরিবর্তনশীল রফতানি করে জিএনইউ গ্রেপে করা যেতে পারে GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git': ^)
বুফ

6
বা এগ্রি ব্যবহার করে সমতুল্য :ag -L 'foo'
বিশপ

5
ম্যাজিকের মতো কাজ করে! ইঙ্গিত: সাব-rL-L
মিলানোর

1
@ ল্যারি - গ্লোব্বিংয়ের সমস্যাগুলি এড়ানোর একটি পরিষ্কার উপায় হ'ল "ফাঁকা" দীর্ঘ বিকল্পটি এর মতো ব্যবহার করা: grep -L 'foo' -- *মানটি হ'ল এই আদেশগুলির পরে দীর্ঘতর বিকল্পগুলি গ্রহণ করা নির্দেশগুলি --এই বিন্দুর পরে আর কোনও বিকল্প নেই বলে নির্দেশ করে।
ধানের ল্যান্ডাউ

44

একবার দেখুন ack। এটি .svnস্বয়ংক্রিয়ভাবে আপনার জন্য বর্জন করে , আপনাকে পার্লকে নিয়মিত এক্সপ্রেশন দেয় এবং এটি একটি একক পার্ল প্রোগ্রামের একটি সহজ ডাউনলোড।

আপনি যা সন্ধান করছেন তার সমতুল্য হ'ল ack:

ack -L foo

23

আপনি একা গ্রেপ দিয়ে এটি করতে পারেন (খুঁজে না পেয়ে)।

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

17

নিম্নলিখিত কমান্ডটি আমাকে সমস্ত ফাইল দেয় যা প্যাটার্ন ধারণ করে না foo:

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep 0

4
আপনি গ্রেপ 0 টি শেষে গ্রেপ 0 to এ পরিবর্তন করতে চান (অন্যথায় আপনি ফাইলগুলির মধ্যে ভ্রান্ত ম্যাচগুলি পান যাঁদের ফাইলের নাম 0 থাকে)।
ক্লোসাউ

9
@ ক্লাউসউ বেশিরভাগ ক্ষেত্রেই সঠিক ... তবে grep '0$'10 লাইনের বহুগুণের সাথে ফাইলগুলিও মিলবে! আপনি প্রয়োজন grep ':0$'লাইনের শেষে: '0' একটি সুনির্দিষ্ট জন্য চেক করতে শেষে। তারপরে আপনি কেবল শূন্য লাইন মেলে ফাইলগুলি পাবেন।
ট্রিনিট্রনএক্স

আমি যে ইউনিক্স এ আছি সেগুলির বিকল্পগুলির সন্ধান বা গ্রেপের সংস্করণ ছিল না, সুতরাং অন্যান্য মন্তব্যে প্রস্তাবিত "এসিসি" কমান্ডটি সহ আমাকে যেতে হয়েছিল।
কেসি বাল্টজ

14

নিম্নলিখিত কমান্ডটি svnসেকেন্ড ব্যবহার করে ফোল্ডারগুলি ফিল্টার করার জন্য অনুসন্ধানের প্রয়োজনীয়তা বাদ দেয় grep

grep -rL "foo" ./* | grep -v "\.svn"


6

আমার শুভ কামনা রইল

grep -H -E -o -c "foo" */*/*.ext | grep ext:0

আমার প্রয়াস grep -vকেবলমাত্র আমাকে "ফু" ছাড়াই সমস্ত লাইন দিয়েছে।


4

সমস্যা

আমার একটি বড় প্রকল্পের রিফ্যাক্টর দরকার যা .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

3

আপনি যদি গিট ব্যবহার করছেন, এটি ট্র্যাক করা সমস্ত ফাইল অনুসন্ধান করে:

git grep -L "foo"

এবং যদি আপনি ** সাব globbing চালু ট্র্যাক ফাইল একটি উপসেট অনুসন্ধান করতে পারেন ( shopt -s globstar.bashrc মধ্যে দেখতে এই ):

git grep -L "foo" -- **/*.cpp

1

আমার গ্রেপের কোনও-এল বিকল্প নেই। আমি এটি অর্জনের জন্য একান্ত চেষ্টা করি।

ধারণাগুলি হ'ল:

  1. প্রাপ্য স্ট্রিংযুক্ত সমস্ত ফাইলের নাম একটি txt1.txt এ ফেলে দিতে হবে।
  2. ডিরেক্টরিতে সমস্ত ফাইলের নাম একটি txt2.txt এ ফেলে দিন।
  3. ডিফ ডিমান্ডের সাহায্যে 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
ডিজিজ অক্সিজেন

1

find *20161109* -mtime -2|grep -vwE "(TRIGGER)"

আপনি "ফাইন্ড" এর অধীনে ফিল্টার এবং "গ্রেপ-ভিডব্লিউই" এর আওতায় ব্যতীত স্ট্রিং উল্লেখ করতে পারেন। আপনার যদি পরিবর্তিত সময়েও ফিল্টার করতে হয় তবে অনুসন্ধানের জন্য এমটাইম ব্যবহার করুন।


এটি স্ট্রিং ছাড়াই আমাকে সমস্ত লাইন দেখায় বলে মনে হয়, ওপি কেবল ফাইলের নাম জানতে চায়।
বেন ফার্মার

1

বাগ রিপোর্টটি খুলুন

@ টুকান দ্বারা মন্তব্য করা হয়েছে, -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

এই failes সময় কারণে সময় -L- বাগ github.com/ggreer/the_silver_searcher/issues/238
tukan

@ টুকান প্রম্পটের জন্য ধন্যবাদ। আমি উত্তর আপডেট করেছি; উত্তর মুছতে না পারার পরিবর্তে বাগ সংক্রান্ত তথ্য সহ খোলার উপায়।
dfri

1

গ্রেপ-এর বিকল্প বিকল্প (উদাহরণস্বরূপ আইবিএম এআইএক্স) না থাকলে অন্য বিকল্প, গ্রেপ এবং শেল ছাড়া কিছুই নেই:

for file in * ; do grep -q 'my_pattern' $file || echo $file ; done

-4
grep -irnw "filepath" -ve "pattern"

অথবা

grep -ve "pattern" < file

উপরের কমান্ডটি আমাদের ফলাফল দেবে কারণ -v অনুসন্ধান করা প্যাটার্নের বিপরীতটি খুঁজে পায়


1
এটি লাইনগুলি মুদ্রণ করে যা প্যাটার্নটি ধারণ করে না। আপনি -lকেবল ফাইলের নাম মুদ্রণের বিকল্প যুক্ত করতে পারেন ; তবে এটি এখনও এমন কোনও ফাইলের নাম মুদ্রণ করে যাতে কোনও রেখা থাকে যা প্যাটার্নটি ধারণ করে না। আমি বিশ্বাস করি যে ওপি সেই ফাইলগুলি সন্ধান করতে চায় যাতে প্যাটার্নে কোনও লাইন থাকে না।
ট্রিপলি

কমান্ড আপনি "ফাইলপথে" ফাইলগুলিকে তাদের সমস্ত লাইন দিয়ে তালিকাভুক্ত করেছেন যাতে "প্যাটার্ন" থাকে না।
এপ্রোডান

-6

নিম্নোক্ত কমান্ড আপনাকে "foo" স্ট্রিংয়ের অন্তর্ভুক্ত রেখাগুলি ফিল্টার করতে সহায়তা করতে পারে।

cat file | grep -v "foo"

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