Tìm kiếm thư mục
Dựa trên các bản tóm tắt được hiển thị trong trang man, tôi sẽ nói có, nó có thể xử lý một thư mục, nhưng nhìn vào các công tắc, nó không thể chỉ tìm một tệp dựa trên một mẫu. Cho rằng bạn sẽ phải tranh thủ find
. Lệnh ack
này bao gồm tùy chọn --files-from=FILE
để nó có thể được cung cấp một danh sách các tệp từ đó find
.
tóm tắc
ack [options] PATTERN [FILE...]
ack -f [options] [DIRECTORY...]
sử dụng
--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.
Có --ignore-file=
tùy chọn có thể cung cấp cho bạn những gì bạn muốn nhưng có vẻ hơi khó sử dụng.
--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".
Tìm kiếm các loại tệp cụ thể
Cách khác duy nhất tôi có thể hình dung để thực hiện điều này thông qua ack
là sử dụng công --type
tắc của nó :
--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.
Để xem những loại có sẵn:
$ ack --help-types | grep -E "perl|cpp"
định dạng. Ví dụ, cả --type = perl và --perl đều hoạt động. - [không] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [no] objcpp .mm .h - [no] perl .pl .pm .pod .t .psgi; phù hợp với dòng đầu tiên / ^ # #.
Ví dụ
Tìm tất cả các tệp Perl, dựa trên cả tên tệp (* .pm, * .pl, * .t và * .pod) và dòng shebang.
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
Tìm tất cả các tệp C ++:
$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h
Tìm kiếm foo trong thanh * .c
Vì vậy, làm thế nào bạn có thể thực hiện những gì bạn muốn? Vâng, bạn sẽ phải sử dụng find
để làm điều này:
$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo
adir/dir1/bar1.c
1:foo
2:foo
Bạn cũng có thể sử dụng ack
khả năng tìm kiếm các tệp khớp với một mẫu nhất định trong tên tệp của họ (bằng cách sử dụng -g <pattern>
), sau đó chuyển danh sách này sang lệnh thứ hai ack
sử dụng -x
hoặc --files-from=-
..
Sử dụng -x
:
$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Sử dụng -files-from=-
:
$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Trong cả hai trường hợp, chúng tôi khớp với tên tệp mà bạn muốn sử dụng biểu thức chính này:
\bbar.*.c$
Điều này khớp với các tệp có tên bar.*c
và kết thúc sau khi .c
sử dụng kết thúc neo dòng , $
. Chúng tôi cũng xem xét để đảm bảo rằng các tên có một ký tự ranh giới sử dụng \b
. Điều này sẽ thất bại đối với các tệp có chứa các ký tự ranh giới như $bar.c
hoặc %bar.c
ví dụ.
find . -name "bar*.c" -exec ack foo {} \;
? Không có gì đặc biệtgrep
, bạn có thể sử dụng bất kỳ lệnh nào với find-exec
.