ディレクトリを検索する
マニュアルページに示されている概要に基づいて、ディレクトリを処理することはできますが、スイッチを見ると、パターンに基づいたファイルだけを検索することはできません。そのためには、入隊する必要がありますfind
。コマンドack
にはオプションが含まれている--files-from=FILE
ため、ファイルのリストをから提供できますfind
。
あらすじ
ack [options] PATTERN [FILE...]
ack -f [options] [DIRECTORY...]
使用法
--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.
--ignore-file=
あなたが望むものをあなたに与えるかもしれないオプションがありますが、実際に使用するのは少し苦痛のようです。
--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".
特定の種類のファイルを検索する
私がこれを行うことを想像できる唯一の他の方法ack
は、その--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.
利用可能なタイプを確認するには:
$ ack --help-types | grep -E "perl|cpp"
フォーマット。たとえば、-type = perlと--perlの両方が機能します。-[no] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx-[no] objcpp .mm .h-[no] perl .pl .pm .pod .t .psgi; 最初の行は/^#!.*\bperl/-[no] perltest .tに一致します
例
ファイル名(* .pm、*。pl、*。t、*。pod)とshebang行の両方に基づいて、すべてのPerlファイルを見つけます。
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
すべてのC ++ファイルを検索します。
$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h
bar * .cでfooを検索する
それでは、どうすれば自分の望むことを達成できますか?さて、あなたはおそらくfind
これを行うために使用する必要があります:
$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo
adir/dir1/bar1.c
1:foo
2:foo
またack
、ファイル名で特定のパターンに一致するファイルを検索する機能を使用して(を使用-g <pattern>
)、このリストをack
using -x
または--files-from=-
..の2回目の呼び出しに渡すこともできます。
を使用して-x
:
$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
を使用して-files-from=-
:
$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
いずれの場合でも、この正規表現を使用して、必要なファイル名を照合します。
\bbar.*.c$
これはbar.*c
、行末.c
アンカーを使用した後に名前がで終わるファイルに一致します$
。また、を使用して、名前に境界文字が含まれていることを確認し\b
ます。これは、次のような境界文字を含むファイルに対して失敗する$bar.c
か、%bar.c
例えば。
find . -name "bar*.c" -exec ack foo {} \;
ですか?特別なことgrep
は何もありません。findで任意のコマンドを使用できます-exec
。