Пошук каталогів
На основі конспекту, показаного на сторінці man, я б сказав, що так, він може обробляти каталог, але, дивлячись на комутатори, він не може шукати лише файл на основі шаблону. Для цього вам доведеться заручитися 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 = perl і --perl працюють. - [ні] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [no] objcpp .mm .h - [no] perl .pl .pm .pod .t .psgi; збігається перший рядок /^#!.*\bperl/ - [ні] perltest .t
Приклади
Знайдіть усі файли Perl на основі імені файлу (* .pm, * .pl, * .t і * .pod), і рядка shebang.
$ 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
Пошук foo в барі * .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
наприклад.
find . -name "bar*.c" -exec ack foo {} \;
? У цьому немає нічого особливогоgrep
, ви можете використовувати будь-яку команду з find-exec
.