Ricerca nelle directory
In base alla sinossi mostrata nella pagina man direi di sì, può elaborare una directory, ma guardando gli switch non può cercare solo un file basato su un modello. Per questo dovrai arruolarti find
. Il comando ack
include l'opzione in --files-from=FILE
modo che possa essere alimentato un elenco di file da find
.
sinossi
ack [options] PATTERN [FILE...]
ack -f [options] [DIRECTORY...]
uso
--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.
C'è l' --ignore-file=
opzione che può darti quello che vuoi, ma sembra un po 'una seccatura da usare davvero.
--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".
Ricerca di tipi specifici di file
L'unico altro modo in cui posso concepire di fare proprio questo ack
è usare il suo --type
interruttore:
--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.
Per vedere quali tipi sono disponibili:
$ ack --help-types | grep -E "perl|cpp"
formato. Ad esempio, entrambi --type = perl e --perl funzionano. - [no] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [no] objcpp .mm .h - [no] perl .pl .pm .pod .t .psgi; la prima riga corrisponde a /^#!.*\bperl/ - [no] perltest .t
Esempi
Trova tutti i file Perl, in base sia al nome file (* .pm, * .pl, * .t e * .pod) che alla riga shebang.
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
Trova tutti i file C ++:
$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h
Ricerca foo in bar * .c
Quindi come puoi realizzare quello che vuoi? Bene, dovrai probabilmente usarlo find
per fare questo:
$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo
adir/dir1/bar1.c
1:foo
2:foo
Puoi anche usare ack
la capacità di cercare file che corrispondono a un determinato modello nei loro nomi di file (usando -g <pattern>
), e quindi passare questo elenco a una seconda chiamata di ack
utilizzo -x
o --files-from=-
..
Utilizzando -x
:
$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Utilizzando -files-from=-
:
$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
In entrambi i casi stiamo abbinando i nomi dei file che desideri utilizzando questa regex:
\bbar.*.c$
Questo corrisponde a file il cui nome è bar.*c
e fine dopo la .c
utilizza alla fine della linea di ancoraggio, $
. Cerchiamo anche di assicurarci che i nomi abbiano un carattere limite usando \b
. Ciò non riuscirà per i file che contengono caratteri limite come $bar.c
o %bar.c
ad esempio.
find . -name "bar*.c" -exec ack foo {} \;
? Non c'è niente di specialegrep
, puoi usare qualsiasi comando con find-exec
.