Tôi đang tìm một tên hàm và cấu trúc thư mục sâu và có rất nhiều tệp để xem.
Thông thường tôi đi với một cái gì đó như find * | grep functionname
nhưng đó là cách tốt nhất?
xargs
? Hoặc -exec
chính trong find
?
Tôi đang tìm một tên hàm và cấu trúc thư mục sâu và có rất nhiều tệp để xem.
Thông thường tôi đi với một cái gì đó như find * | grep functionname
nhưng đó là cách tốt nhất?
xargs
? Hoặc -exec
chính trong find
?
Câu trả lời:
$ find . -type f -print0 | xargs -0 grep foo
$ grep -r foo . # GNU grep only
và ở zsh
với setopt extendedglob
,
$ grep foo **/*(.)
find . -type f -print0 | xargs -0 grep /dev/null foo
để grep
luôn in tên tệp phù hợp. Hoặc find . -type f -exec grep /dev/null {} +
, đối với các triển khai đã bắt kịp POSIX.2004 (không bao gồm OpenBSD tại thời điểm này).
grep
đã không có nó (ý tưởng là nếu bạn muốn đệ quy, bạn sử dụng find
với grep
) và thêm nó sau khi thực tế cho hệ thống đã làm việc trong nhiều năm có thể phá vỡ mọi thứ. (GNU grep
không hoạt động hoàn toàn giống với Hệ thống V. grep
)
Thay thế cho các find | xargs
câu trả lời, bạn có thể cân nhắc sử dụng ctags vì bạn nói rằng bạn đang tìm kiếm không phải văn bản, mà cụ thể là tên hàm.
Để làm điều này, bạn sẽ chạy ctags
với nguồn của mình để tạo một TAGS
tệp và sau đó chạy grep
với TAGS
tệp sẽ nhổ ra các dòng theo định dạng sau:
{tagname}<Tab>{tagfile}<Tab>{tagaddress}
Nơi tagname
sẽ chứa tên hàm, tagfile
là tệp chứa trong đó và tagaddress
sẽ là một lệnh vi để đến dòng đó. (Có thể chỉ là một số dòng.)
(Có cách nào dễ dàng để làm điều gì đó tương tự với các chỉ số khác nhau mà nhật thực xây dựng hoặc chỉ truy vấn cơ sở dữ liệu nhật thực không?)
Có chuyện gì với grep -r
(== grep --recursive
)? Am i thiếu cái gì ở đây?
(+1 cho ack
quá - Tôi thường xuyên sử dụng cả hai)
chỉnh sửa: Tôi tìm thấy một bài viết tuyệt vời chi tiết các khả năng và cạm bẫy nếu bạn không có GNU grep
ở đây . Nhưng, nghiêm túc, nếu bạn không có GNU grep
sẵn, việc nhận ack
được thậm chí còn được khuyến khích cao hơn.
grep
không có tùy chọn đó. đã cập nhật câu trả lời của tôi :)
find . | xargs grep
sẽ thất bại trên tên tệp có dấu cách:
> echo test > "a b c"
> find . | xargs grep test
grep: ./a: No such file or directory
grep: b: No such file or directory
grep: c: No such file or directory
Lưu ý rằng ngay cả -print0 có vấn đề này.
Theo ý kiến của tôi, tốt hơn là sử dụng -exec grep
với find sẽ xử lý tất cả tên tệp trong nội bộ và tránh vấn đề này:
> find . -exec grep test {} \;
test
>
find … -print0 | xargs -0 …
copes với tên tập tin tùy ý. Tất cả các triển khai find
cho phép tuân thủ POSIX.2004 find … -exec … {} +
, gọi lệnh với nhiều tệp cùng một lúc. Một lệnh tốt hơn là find . -type f -exec grep test /dev/null {} +
; việc thêm vào /dev/null
là như vậy grep
sẽ liên tục in tên tệp khi tìm thấy kết quả khớp.
Nếu đĩa của bạn nhanh, bạn có thể muốn song song grep:
find . -type f -print0 | parallel -0 grep foo
Xem video giới thiệu để tìm hiểu thêm về GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ
$ find -type f -print0 | xargs -r0 grep foo
-r
trong xargs
việc tránh thực thi lệnh nếu không có đầu vào. Đây là một phần mở rộng GNU.
Ngoài ra còn ag
có được thiết kế đặc biệt cho điều này và cách tốt hơn ack
. Nó có sẵn trong các phiên bản Debian / Ubuntu gần đây trong gói silversearcher-ag .
find
chỉ tìm thấy tên tập tin , không phải nội dung.