Làm cách nào để sử dụng grep để tìm kiếm thư mục hiện tại cho bất kỳ và tất cả các tệp có chứa chuỗi "xin chào" và chỉ hiển thị các tệp .h và .cc?
Làm cách nào để sử dụng grep để tìm kiếm thư mục hiện tại cho bất kỳ và tất cả các tệp có chứa chuỗi "xin chào" và chỉ hiển thị các tệp .h và .cc?
Câu trả lời:
grep -r --include=*.{cc,h} "hello" .
Điều này đọc: tìm kiếm đệ quy (trong tất cả các thư mục con) cho tất cả các tệp .cc OR .h có chứa "xin chào" tại thư mục .
(hiện tại) này
Bạn có thể chuyển vào các ký tự đại diện thay vì chỉ định tên tệp hoặc sử dụng stdin.
grep hello *.h *.cc
-R
không làm việc không may. Nó mở rộng *
trước khi đi đệ quy.
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
.
Kiểm tra các trang hướng dẫn find
và xargs
để biết chi tiết.
-print0
sau khi '*.cc'
bạn không có hành động cho phần tìm kiếm đó. Hoặc bạn phải chèn dấu ngoặc đơn vào đó : find . \( -name '*.cc' -or -name '*.h' \) -print0
.
find -exec +
cú pháp thay vì xargs
-exec grep "hello" {} +
trong đó cặp dấu ngoặc nhọn thể hiện tên tệp. Gợi ý tốt.
Nếu bạn cần một tìm kiếm đệ quy, bạn có nhiều lựa chọn. Bạn nên cân nhắc ack
.
Không, nếu bạn có GNU find
và xargs
:
find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null
Việc sử dụng /dev/null
đảm bảo bạn có được tên tập tin được in; các -print0
và-0
giao dịch với tên tập tin chứa khoảng trống (dòng mới, vv).
Nếu bạn không có tên khó tính (có dấu cách, v.v.), bạn có thể sử dụng:
find . -name '*.*[ch]' -print | xargs grep hello /dev/null
Điều này có thể chọn một vài tên mà bạn không có ý định, bởi vì mô hình khớp sẽ mờ hơn (nhưng đơn giản hơn), nhưng nếu không thì hoạt động. Và nó hoạt động với các phiên bản không phải của GNU find
và xargs
.
find ... -exec grep "hello" {} +
Nếu tôi đọc kỹ câu hỏi của bạn, bạn yêu cầu "grep để tìm kiếm thư mục hiện tại cho bất kỳ và tất cả các tệp có chứa chuỗi" xin chào "và chỉ hiển thị các tệp .h và .cc". Vì vậy, để đáp ứng yêu cầu chính xác của bạn ở đây là trình của tôi:
Điều này sẽ hiển thị tên tập tin:
grep -lR hello * | egrep '(cc|h)$'
... và điều này sẽ hiển thị tên và nội dung của tệp:
grep hello `grep -lR hello * | egrep '(cc|h)$'`
grep -l hello **/*.{h,cc}
Bạn có thể muốn shopt -s nullglob
tránh các thông báo lỗi nếu không có tệp .h hoặc không có .cc.
Cách đơn giản nhất: grep -Ril "Your text" /
grep -si "hello" --include=*.{cc,h} ./* ./.*
(cũng tìm kiếm các tệp ẩn). Đây là phiên bản chung để tìm kiếm một chuỗi trong tất cả / tệp ẩn :grep -s "hello" * .*
. Có thể nói chung là hữu ích nhất (và đơn giản nhất), điều này tìm kiếm tất cả các tệp không bị ẩn cho "xin chào":grep -si "hello" ./*
Nhờ vào bài đăng này: askubfox.com/a/777456