Recherche dans les annuaires
D'après le synopsis présenté dans la page de manuel, je dirais que oui, il peut traiter un répertoire, mais en regardant les commutateurs, il ne peut pas rechercher uniquement un fichier basé sur un modèle. Pour cela, vous devrez vous enrôler find
. La commande ack
inclut l'option --files-from=FILE
afin qu'elle puisse être alimentée avec une liste de fichiers find
.
synopsis
ack [options] PATTERN [FILE...]
ack -f [options] [DIRECTORY...]
usage
--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.
Il y a l' --ignore-file=
option qui peut vous donner ce que vous voulez mais semble un peu pénible à utiliser.
--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".
Recherche de types de fichiers spécifiques
La seule autre façon que je puisse concevoir de faire cela via ack
consiste à utiliser son --type
commutateur:
--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.
Pour voir quels types sont disponibles:
$ ack --help-types | grep -E "perl|cpp"
format. Par exemple, les deux types --type = perl et --perl fonctionnent. - [no] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [no] objcpp .mm .h - [no] perl .pl .pm .pod .t .psgi; correspond à la première ligne /^#!.*\bperl/ - [no] perltest .t
Exemples
Trouvez tous les fichiers Perl, en fonction du nom de fichier (* .pm, * .pl, * .t et * .pod) et de la ligne shebang.
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
Trouvez tous les fichiers C ++:
$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h
Recherche de foo in bar * .c
Alors, comment pouvez-vous accomplir ce que vous voulez? Eh bien, vous devrez probablement utiliser find
pour faire ceci:
$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo
adir/dir1/bar1.c
1:foo
2:foo
Vous pouvez également utiliser ack
la possibilité de rechercher des fichiers qui correspondent à un modèle donné dans leurs noms de fichier (using -g <pattern>
), puis de passer cette liste à un second appel de ack
using -x
ou --files-from=-
..
Utilisant -x
:
$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Utilisant -files-from=-
:
$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Dans les deux cas, nous faisons correspondre les noms de fichiers que vous souhaitez utiliser avec cette expression rationnelle:
\bbar.*.c$
Cela correspond à des fichiers dont le nom est bar.*c
et de fin après l' .c
utilisation de la fin de l' ancrage de la ligne, $
. Nous vérifions également que les noms ont un caractère de limite \b
. Cela échouera pour les fichiers contenant des caractères de limite tels que $bar.c
ou %bar.c
par exemple.
find . -name "bar*.c" -exec ack foo {} \;
? Il n'y a rien de spécialgrep
, vous pouvez utiliser n'importe quelle commande avec find-exec
.