Dizinler aranıyor
Man sayfasında gösterilen özetden yola çıkarak evet, bir dizini işleyebileceğini söyleyebilirim, ancak anahtarlara bakarak sadece bir desene dayanan bir dosyayı arayamaz. Bunun için listelemek zorundasınız find
. Komut ack
, içerdiği --files-from=FILE
dosyaların bir listesinden beslenebilmesi için seçeneği içerir find
.
özet
ack [options] PATTERN [FILE...]
ack -f [options] [DIRECTORY...]
kullanım
--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.
Orada --ignore-file=
size verebilir seçenek istediğini ancak ağrı biraz aslında kullanmak gibi görünüyor.
--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".
Belirli dosya türlerini arama
Bunu yapmayı düşünebilmemin tek yolu anahtarını ack
kullanmak --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.
Hangi türlerin mevcut olduğunu görmek için:
$ ack --help-types | grep -E "perl|cpp"
biçim. Örneğin, --type = perl ve --perl işlevi. - [no] cpp .cpp .cc .cxx .m. ilk satır /^#!.*\bperl/ - [no] perltest .t ile eşleşir.
Örnekler
Dosya adını (* .pm, * .pl, * .t ve * .pod) ve shebang satırını temel alarak tüm Perl dosyalarını bulun.
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
Tüm C ++ dosyalarını bul:
$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h
Barda foo aranıyor * .c
Öyleyse istediğini nasıl başarabilirsin? Bunu find
yapmak için muhtemelen kullanmanız gerekecek :
$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo
adir/dir1/bar1.c
1:foo
2:foo
Ayrıca ack
, belirli bir şablonla dosya adlarında (kullanarak -g <pattern>
) eşleşen dosyaları arama özelliğini kullanabilir ve ardından bu listeyi veya tuşlarını ack
kullanarak ikinci bir çağrıya geçirebilirsiniz .-x
--files-from=-
Kullanarak -x
:
$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Kullanarak -files-from=-
:
$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Her iki durumda da, bu regex'i kullanmak istediğiniz dosya isimleriyle eşleştiriyoruz:
\bbar.*.c$
Bu , satır sonu bağlantısının kullanımından bar.*c
sonra adı ve sonu olan dosyalarla eşleşir ,. Ayrıca, adların kullanımda sınır karaktere sahip olduğundan emin olmak istiyoruz . Bu, örneğin veya gibi sınır karakterleri içeren dosyalar için başarısız olur ..c
$
\b
$bar.c
%bar.c
find . -name "bar*.c" -exec ack foo {} \;
? Özel bir şey yokgrep
, find ile birlikte herhangi bir komutu kullanabilirsiniz-exec
.