निर्देशिका खोज रहे हैं
मैन पेज में दिखाए गए सिनॉप्सिस के आधार पर मैं कहूंगा कि यह एक निर्देशिका को संसाधित कर सकता है, लेकिन स्विच को देखते हुए यह एक पैटर्न के आधार पर सिर्फ एक फ़ाइल के लिए नहीं देख सकता है। उसके लिए आपको सूची तैयार करनी होगी 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"
प्रारूप। उदाहरण के लिए, दोनों - टाइप = पर्ल और - एपर्ल काम। - [कोई] सीपीसी .सीपीसी .सीपीसी। एमएक्स .एचपी .एचपी .एचएच .एच। एक्सएक्सएक्स - [नहीं] ओब्जेक्प .एमएम .एच। - [नहीं] पर्ल। पीपीएम। पीपीओ। टीपीएस। पहली पंक्ति /^# से मेल खाती है!
उदाहरण
फ़ाइल नाम (* .pm, * .pl, * .t और * .pod) और शबंग रेखा दोनों के आधार पर सभी पर्ल फाइलें खोजें।
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
सभी C ++ फ़ाइलें खोजें:
$ 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
या तो मामले में हम उन फ़ाइलनामों का मिलान कर रहे हैं, जिन्हें आप इस regex का उपयोग करना चाहते हैं:
\bbar.*.c$
यह उन फ़ाइलों से मेल खाता है जिनका नाम है bar.*c
और .c
लाइन एंकर के अंत का उपयोग करने के बाद समाप्त होता है $
। हम यह भी सुनिश्चित करने के लिए देखते हैं कि नामों का उपयोग करने के लिए एक सीमा चरित्र है \b
। यह उन फ़ाइलों के लिए विफल हो जाएगा जिनमें सीमा वर्ण होते हैं जैसे कि $bar.c
या %bar.c
उदाहरण के लिए।
find . -name "bar*.c" -exec ack foo {} \;
? इसमें कुछ खास नहीं हैgrep
, आप फाइंड के साथ किसी भी कमांड का उपयोग कर सकते हैं-exec
।