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=FILEdosyaları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ı ackkullanmak --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 findyapmak 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ı ackkullanarak 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.*csonra 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.