Buscando directorios
Según la sinopsis que se muestra en la página de manual, diría que sí, puede procesar un directorio, pero al mirar los interruptores no puede buscar solo un archivo basado en un patrón. Para eso tendrás que alistarte find
. El comando ack
incluye la opción --files-from=FILE
para que se pueda alimentar una lista de archivos find
.
sinopsis
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.
Existe la --ignore-file=
opción que puede darle lo que desea, pero parece un poco difícil de usar.
--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".
Buscar tipos específicos de archivos
La única otra forma en que puedo concebir hacer esto ack
es usar su --type
interruptor:
--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.
Para ver qué tipos están disponibles:
$ ack --help-types | grep -E "perl|cpp"
formato. Por ejemplo, tanto --type = perl como --perl funcionan. - [no] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [no] objcpp .mm .h - [no] perl .pl .pm .pod .t .psgi; primera línea coincide con /^#!.*\bperl/ - [no] perltest .t
Ejemplos
Encuentre todos los archivos Perl, en función del nombre de archivo (* .pm, * .pl, * .t y * .pod) y la línea shebang.
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
Encuentra todos los archivos C ++:
$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h
Buscando a foo en el bar * .c
Entonces, ¿cómo puedes lograr lo que quieres? Bueno, probablemente tengas que usar find
para hacer esto:
$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo
adir/dir1/bar1.c
1:foo
2:foo
También puede usar ack
la capacidad de buscar archivos que coincidan con un patrón determinado en sus nombres de archivo (usando -g <pattern>
), y luego pasar esta lista a una segunda invocación de ack
usar -x
o --files-from=-
...
Utilizando -x
:
$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Utilizando -files-from=-
:
$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
En cualquier caso, estamos haciendo coincidir los nombres de archivo que desea con esta expresión regular:
\bbar.*.c$
Esto coincide con los archivos cuyo nombre es bar.*c
y final después del .c
uso final de la línea de anclaje, $
. También buscamos asegurarnos de que los nombres tengan un carácter de límite usando \b
. Esto fallará para los archivos que contienen caracteres de límite como $bar.c
o %bar.c
por ejemplo.
find . -name "bar*.c" -exec ack foo {} \;
? No tiene nada de especialgrep
, puede usar cualquier comando con find's-exec
.