কেবলমাত্র সেই ফাইলগুলিতে অনুসন্ধান করুন যা এস্কির সাথে একটি প্যাটার্নের সাথে মেলে


49

নির্দিষ্ট 'গ্লোব' প্যাটার্নের সাথে মেলে এমন ফাইলগুলির মাধ্যমেই অ্যাক অনুসন্ধান করতে পারে (উদাহরণস্বরূপ: "বার * .সি" নামক সমস্ত ফাইলের জন্য ফু অনুসন্ধান করুন)। আদেশ

ack foo "bar*.c"

শুধুমাত্র বর্তমান ডিরেক্টরিতে কাজ করে।

দ্রষ্টব্য: আমি জানি এটি সন্ধান-এক্সেক দ্বারা সম্ভব:

find . -name "bar*.c" -type f -exec ack foo {} + 

তবে আমি একটি ছোট এবং সাধারণ এসি কমান্ড চাই, কারণ সংস্করণ নিয়ন্ত্রণ ডিরেক্টরিগুলি এড়ায় না find


2
বুঝতে পারছি না, ব্যবহারে find . -name "bar*.c" -exec ack foo {} \;কী দোষ হয়েছে ? এখানে বিশেষ কিছু নেই grep, আপনি সন্ধানের সাথে কোনও আদেশ ব্যবহার করতে পারেন -exec
terdon

1
@ স্টারডন সংস্করণ নিয়ন্ত্রণ ডিরেক্টরিগুলি অনুসন্ধান করে এবং আমি এটি চাই না।
compie

2
তারপরে আপনার প্রশ্নটি সম্পাদনা করুন এবং আপনার চারপাশে কাজ করার সীমাবদ্ধতার বর্ণনা দিন explain
terdon

উত্তর:


28

ডিরেক্টরি অনুসন্ধান করা হচ্ছে

ম্যান পৃষ্ঠায় প্রদর্শিত সংক্ষিপ্তসারের উপর ভিত্তি করে আমি বলব হ্যাঁ এটি কোনও ডিরেক্টরিতে প্রক্রিয়া করতে পারে তবে স্যুইচগুলির দিকে তাকালে এটি কোনও প্যাটার্নের ভিত্তিতে কেবল কোনও ফাইল সন্ধান করতে পারে না। তার জন্য আপনাকে তালিকাভুক্ত করতে হবে find। কমান্ডটি ackবিকল্পটি অন্তর্ভুক্ত করে --files-from=FILEযাতে এটি থেকে ফাইলগুলির একটি তালিকা খাওয়ানো যায় find

সংক্ষিপ্তসার

       ack [options] PATTERN [FILE...]
       ack -f [options] [DIRECTORY...]

ব্যবহার

   --files-from=FILE
       The list of files to be searched is specified in FILE.  The list of
       files are separated by newlines.  If FILE is "-", the list is
       loaded from standard input.

নেই --ignore-file=বিকল্প যা আপনি দিতে পারেন আপনি যা চান তা কিন্তু মনে হয় ব্যাথা একটি বিট আসলে ব্যবহার করতে।

   --ignore-file=FILTERTYPE:FILTERARGS
       Ignore files matching FILTERTYPE:FILTERARGS.  The filters are
       specified identically to file type filters as seen in "Defining
       your own types".

নির্দিষ্ট ধরণের ফাইল অনুসন্ধান করা হচ্ছে

আমি কেবল ackএটির --typeমাধ্যমেই অন্য কিছু করতে পারি তা কল্পনা করতে পারি এটির সুইচটি ব্যবহার করা :

   --type=[no]TYPE
       Specify the types of files to include or exclude from a search.
       TYPE is a filetype, like perl or xml.  --type=perl can also be
       specified as --perl, and --type=noperl can be done as --noperl.

       If a file is of both type "foo" and "bar", specifying --foo and
       --nobar will exclude the file, because an exclusion takes
       precedence over an inclusion.

কি ধরণের উপলব্ধ তা দেখতে:

$ ack --help-types | grep -E "perl|cpp"

বিন্যাস। উদাহরণস্বরূপ, --type = পার্ল এবং - স্পার উভয়ই কাজ করে। । প্রথম লাইনের সাথে মেলে

উদাহরণ

ফাইলের নাম (*। Pm, * .pl, * .t এবং * .pod) এবং শেবাং লাইন উভয়ের উপর ভিত্তি করে সমস্ত পার্ল ফাইল সন্ধান করুন।

$ ack -f --type perl 
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl

সমস্ত সি ++ ফাইল সন্ধান করুন:

$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h

বার * .c এ ফুও অনুসন্ধান করা হচ্ছে

তাহলে আপনি কী চান তা কীভাবে সম্পাদন করতে পারেন? ভাল আপনি সম্ভবত এটি করতে ব্যবহার findকরতে হবে:

$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo

adir/dir1/bar1.c
1:foo
2:foo

আপনি ackযে ফাইলগুলি তাদের ফাইলের নামগুলিতে (ব্যবহার করে -g <pattern>) একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে সেগুলি অনুসন্ধান করার ক্ষমতাও ব্যবহার করতে পারেন এবং তারপরে এই তালিকাটি ackব্যবহারের দ্বিতীয় অনুরোধে পাস করুন -xবা --files-from=-..

ব্যবহার -x:

$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo

dir1/bar1.c
1:foo
2:foo

ব্যবহার -files-from=-:

$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo

dir1/bar1.c
1:foo
2:foo

উভয় ক্ষেত্রেই আমরা এই রেজেক্সটি ব্যবহার করতে চাইলে যে ফাইলের নামগুলি আমরা মেলছি:

\bbar.*.c$

এটি লাইন অ্যাঙ্কারের শেষ ব্যবহারের bar.*cপরে যাদের নাম এবং শেষ সেই ফাইলগুলির সাথে মেলে । নামগুলি ব্যবহার করে একটি সীমানা অক্ষর রয়েছে কিনা তাও আমরা লক্ষ্য করি । এটি যেমন বা উদাহরণস্বরূপ সীমানা অক্ষরযুক্ত ফাইলগুলির জন্য ব্যর্থ হবে ।.c$\b$bar.c%bar.c


1
এটি আমার প্রশ্নের উত্তর দেয় না ("বার *
.সি

1
@ কমপি - এটি যে অর্থে আপনি দেখিয়ে দিচ্ছেন যে ফাইলগুলি আপনি চান তার একটি টুকরো কীভাবে পাবেন to cppফাইল অনুসন্ধান করতে ack --type=cpp <string>। দেখুন ackএই সব যদিও সম্পর্কে আরো জানার জন্য এর man পৃষ্ঠা। তবে আমি আপনাকে মূলত যা বলছি তা হ'ল আপনি ackযেভাবে চান তা ব্যবহার করে অনুসন্ধান করতে পারবেন না ।
SLM

1
সুতরাং এটি এই অর্থে জবাব দেয় যে এটি দেখায় ackযা বলা হয়েছিল তা করতে পারে না।
এক্সিলিটস

@ এক্সিলিট - এই অংশটি এর উত্তর দেয়: বারে foo অনুসন্ধান করা * .সি find adir -iname "bar*.c" | ack --files-from=- foo । অথবা, আপনি যদি কেবল একটি ফাইল চান:echo "barBaz.c" | ack --files-from=- foo
আলেকজান্দ্রবার্ড

2
tldr; ack -g '\bbar.*.c$' | ack -x foo
চিম

14

ফাইলের প্রকারটি জানা থাকলে এটি সহজ, এবং এসিসি ফাইল প্রকারের অনেক কিছু জানে। সুতরাং, উদাহরণস্বরূপ, আপনি কেবল সি ফাইলগুলিতে অনুসন্ধান করতে চান, তার চেয়ে বেশি:

ack --cc 'string'

তবে এটি পরিচিত এক্সটেনশনগুলির মধ্যে একটি না হলে আপনার নিজের ধরণের সংজ্ঞা দেওয়া দরকার। এই কাজ করা উচিত:

ack --type-set barc:match:/bar.+\.c/ --barc 'string'

নোট করুন যে আপনার উভয় টাইপ-সেট এবং - বার্ক প্রয়োজন।

(অ্যান্ডিকে ধন্যবাদ, যিনি মেইলিং লিস্টে এটিতে সহায়তা করেছিলেন।)


1
ঠিক আছে যে কাজ করে তবে 'অ্যাক-এক্স' ব্যবহার করা সহজ। আমি মনে করি আমি এটির সাথে লেগে থাকব।
কম্পি

এখানে ডক্সে একটি লিঙ্ক যুক্ত করা সহায়ক হবে। man ackসত্যিই সাহায্য করে না এবং ccযখন আমি এটি অনুসন্ধান করি তখন তা হয় না ।
ওয়াইপিক্রাম্বল

ack --help = প্রকারভেদগুলি আমি সেখানে ভাবতে পারি। আমি এটি বেশিরভাগ পাইথন এবং অ্যাডা ব্যবহার করি।
ডেভিড বোস্টন

6

"অ্যাক 2 তে নতুন কী?" http://beyondgrep.com/ack-2.0/

অ্যাকড ২.০ সহ, আপনি নতুন -x ব্যবহার করতে পারেন ফাইলের নামগুলিকে পাইকারীর জন্য এসকের এক থেকে অন্যটিতে ডেকে আনতে পারেন।

ack2 -g -i filepattern | ack2 -x -w searchpattern

কেবল আমি এটি কাজ করতে পারি না:

% ack -g "*bar*.c"
Invalid regex '*bar*.c':
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE bar*.c/ at ack line 314.

এইভাবে মনে হচ্ছে -g এর একটি রেজেক্স দরকার, যখন আমি একটি 'গ্লোব' শৈলী বিকল্প চাই ...


2
হ্যাঁ, -gগ্লোব নয়, একটি রেজেক্স নেয়। আপনি আপনার রেজেক্স হিসাবে লিখতে পারেন .*bar.*\.c$
অ্যান্ডি লেস্টার

2
অ্যান্ডিলেস্টার নিশ্চিত করার জন্য ধন্যবাদ আপনি কি এসকে-র জন্য 'গ্লোব' বিকল্পের ধারণা পছন্দ করেন?
compie

3

এটি সবচেয়ে দ্রুত এবং নিরাপদ বলে মনে হবে:

find . -name '*.c' | ack -x 'some string'

-x এসটিডিএন থেকে অনুসন্ধান করার জন্য ফাইলগুলির তালিকা পড়ুন।

তবে ফাইলটি যদি আপনার locateডাটাবেজে থাকতে পারে তবে এটি আরও দ্রুত হবে:

locate --basename '*.c' | ack -x 'some thing'

সনাক্ত করাও পুরানো-স্কুল নিয়মিত প্রকাশগুলি গ্রহণ করতে পারে, কিছুটা কষ্টদায়ক তবে আপনি যদি cফাইলগুলি সন্ধান করেন তবে এটির প্রয়োজন হতে পারে। যেমন

locate --basename --regexp '\.\(c\|cpp\|h\|hpp\|cc\)$' |
    ack -x 'some thing'

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


2

আক গ্লোব স্টাইলের ফাইল নির্বাচন সমর্থন করে না। যেহেতু আমি সত্যিই এটি মিস করছি আমি একটি ছোট শেল স্ক্রিপ্ট এসকিজি তৈরি করেছি :

#!/bin/sh
# 'glob' support for ack
find -name "$2" -type f -exec ack "$1" {} +

এখন আপনি কমান্ডটি ব্যবহার করতে পারেন:

ackg foo "bar*.c"

তবে দ্রষ্টব্য: এটি দুর্ভাগ্যক্রমে সংস্করণ নিয়ন্ত্রণ ডায়ারগুলিতেও অনুসন্ধান করবে (যেমন: .git)।


2

এটি এজি-G বিকল্প হিসাবে সম্পন্ন করা যেতে পারে , সিলভার সন্ধানকারী (অ্যাক-গ্রেপ এর বর্ধিত ক্লোন)।

$ echo foo > bar_wanted.c
$ echo foo > unwanted.c
$ ag -G "bar.*\.c" foo
bar_wanted.c
1:foo

নোট:

  • agপিসিআরই নিয়মিত এক্সপ্রেশন সিনট্যাক্স ব্যবহার করে , তাই এর bar.*\.cপরিবর্তে রেজিপ্সেক্স হওয়া উচিত bar*.c
  • -Gবিকল্প, অনুসন্ধান শব্দ আগে বসে হিসেবে যে পরে কিছু একটি ফাইলের নাম হিসাবে ব্যাখ্যা করা হয় প্রয়োজন।

1

আপনি কি কেবল একটি নির্দিষ্ট প্যাটার্ন চান, বা আপনি কেবল সি উত্স ফাইল চান?

আপনি যদি সমস্ত সি ফাইল চান, ব্যবহার করুন

ack --cc foo

আপনি যদি সমস্ত সি ফাইল চান এবং সি সি হেডার ফাইলগুলি ব্যবহার করতে চান

ack --cc --no-hh foo

1

@ চিমের উত্তরটি সেরা, তবে এটি একটি মন্তব্য হিসাবে লেখা হয়েছে সুতরাং আমি একটি আনুষ্ঠানিক উত্তর হিসাবে পোস্ট করছি ...

ack -g '\bbar.*.c$' | ack -x foo

আমি আপনাকে সত্যটি পছন্দ করতে চাই যে ...


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