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 functionnamenhưng đó là cách tốt nhất?
xargs? Hoặc -execchí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 functionnamenhưng đó là cách tốt nhất?
xargs? Hoặc -execchính trong find?
Câu trả lời:
$ find . -type f -print0 | xargs -0 grep foo
$ grep -r foo . # GNU grep only
và ở zshvới setopt extendedglob,
$ grep foo **/*(.)
find . -type f -print0 | xargs -0 grep /dev/null foođể grepluô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 findvớ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 grepkhông hoạt động hoàn toàn giống với Hệ thống V. grep)
Thay thế cho các find | xargscâ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 ctagsvới nguồn của mình để tạo một TAGStệp và sau đó chạy grepvới TAGStệp sẽ nhổ ra các dòng theo định dạng sau:
{tagname}<Tab>{tagfile}<Tab>{tagaddress}
Nơi tagnamesẽ chứa tên hàm, tagfilelà tệp chứa trong đó và tagaddresssẽ 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 ackquá - 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 grepsẵn, việc nhận ackđược thậm chí còn được khuyến khích cao hơn.
grepkhô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 grepvớ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 findcho 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/nulllà như vậy grepsẽ 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
-rtrong xargsviệ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 agcó đượ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 .
findchỉ tìm thấy tên tập tin , không phải nội dung.