2014-07-10 25 views
6

Tôi đang tìm một chuỗi cụ thể (chủ yếu trong các tệp .c) đệ quy từ thư mục gốc.grep đệ quy - mâu thuẫn

Khi tôi sử dụng điều này, tôi nhận được một danh sách trở lại gần như ngay lập tức.

grep -rl "F_capture" . 

Tuy nhiên, nếu tôi cố gắng để tăng tốc độ bằng những chỉ tìm kiếm các file .c:

grep -r --include=*.c "F_capture" . 

tôi kết thúc với một loạt các cảnh báo thư mục đệ quy như thế này:

grep: warning: ./sys/block/fd0/device/bus/drivers/i8042/i8042/serio1/input:event1/subsystem/event3/device/bus/drivers/pcnet32/0000:00:03.0/subsystem: recursive directory loop 

Khi tôi cố gắng ngăn chặn các cảnh báo bằng tham số -s, tôi không nhận được cảnh báo nhưng tôi cũng không nhận được gì cả - có vẻ như nó đang diễn ra không bao giờ là đất.

grep -rsl --include="*.c" "F_capture" . 

Vì vậy, tôi đoán câu hỏi của tôi là, tại sao các grep đầu tiên tôi sử dụng trở lại một cái gì đó ngay lập tức và các loại khác mà tôi đang nhắm mục tiêu một loại hình cụ thể của tập tin dường như ngắt kết nối. Tôi nghĩ rằng việc tìm kiếm được nhắm mục tiêu sẽ nhanh hơn.

+2

Nó trông giống như một BUG. Các '-r' chỉ theo các liên kết tượng trưng nếu chúng nằm trên dòng lệnh. Dường như, '--include' phá vỡ điều này, và grep thử theo các liên kết tượng trưng. – jm666

+0

Bạn có gặp lỗi tương tự khi bạn thử '--include = *. C' (như trong dòng được trích dẫn thứ hai ở trên) và' --include = "*. C" '(như trong dòng được trích dẫn thứ tư ở trên)? Nếu không, bạn nhận được gì từ 'shopt | grep glob' (giả sử bạn đang sử dụng bash)? – dg99

+0

dg99 - vâng, nếu tôi lấy công tắc -s, tôi sẽ gặp lỗi tương tự nếu tôi sử dụng "* .c" hoặc * .c. Khi tôi gõ shopt | grep glob Tôi nhận được một danh sách "globs" - tất cả đều tắt. – stackbacker

Trả lời

1

Bạn có thể thử này:

find . -type f -name "*.c" -print|xargs grep -l "F_capture" 
+1

Thay đổi '-print' thành' -print0' và thay đổi 'xargs' thành' xargs -0' và mã này sẽ hỗ trợ dấu cách: 'tìm. -type f -name "* .c" -print0 | xargs -0 grep -l "F_capture" '. Điều này cũng có thể sử dụng một số lời giải thích. –

0

Hãy thử lệnh sau:

grep "F_capture" `find -type f -name "*.c"` 
Các vấn đề liên quan