Chỉnh sửa: Nếu bạn có các tiện ích GNU, hãy xem câu trả lời của Gilles cho một phương thức sử dụng grep
các khả năng đệ quy của GNU đơn giản hơn nhiều so với find
cách tiếp cận. Nếu bạn chỉ muốn hiển thị tên tệp, bạn vẫn sẽ muốn thêm -l
tùy chọn như tôi mô tả bên dưới.
Sử dụng grep -l word
để chỉ in tên của các tập tin có chứa một trận đấu.
Nếu bạn muốn tìm tất cả các tệp trong hệ thống tệp kết thúc bằng .sh
, bắt đầu từ thư mục gốc /
, thì đó find
là công cụ thích hợp nhất.
Các khuyến nghị di động và hiệu quả nhất là:
find / -type f -name '*.sh' -exec grep -l word {} + 2>/dev/null
Điều này là dễ đọc như nó có được, và không khó để phân tích nếu bạn hiểu ngữ nghĩa đằng sau mỗi thành phần.
find /
: chạy find
bắt đầu từ gốc hệ thống tập tin,/
-type f
: chỉ khớp với các tệp thông thường
-name '*.sh'
: ... và chỉ khớp các tệp có tên kết thúc bằng .sh
-exec ... {} +
: lệnh chạy được chỉ định trong ...
các tệp khớp trong nhóm, trong đó {}
được thay thế bằng tên tệp trong nhóm. Ý tưởng là chạy lệnh trên càng nhiều tệp cùng một lúc càng tốt trong giới hạn của hệ thống ( ARG_MAX
). Hiệu quả của {} +
biểu mẫu đến từ việc giảm thiểu số lần ...
lệnh phải được gọi bằng cách tối đa hóa số lượng tệp được truyền cho mỗi lần gọi ...
.
grep -l word {}
: trong đó cái {}
giống nhau được {}
lặp lại từ phía trên và được thay thế bằng tên tệp. Như đã giải thích trước đó, grep -l
in tên của các tệp chứa khớp word
.
2>/dev/null
: ẩn thông báo lỗi (về mặt kỹ thuật, chuyển hướng lỗi tiêu chuẩn sang lỗ đen đó /dev/null
). Điều này là vì lý do thẩm mỹ và thực tế, vì việc chạy find
trên /
có thể sẽ dẫn đến các luồng tin nhắn "bị từ chối" mà bạn có thể không quan tâm đối với các tệp mà bạn không có quyền đọc và các thư mục bạn không có quyền truy cập.
Có một số vấn đề với các đề xuất bạn nhận được và đăng trong câu hỏi của bạn. Cả hai
grep word `find / -name \*.sh 2>/dev/null
và
find / -name "*.sh" 2>/dev/null | xargs grep word
thất bại trên các tập tin với khoảng trắng trong tên của họ. Tốt nhất là tránh đặt tên tập tin thay thế hoàn toàn. Cái đầu tiên có thêm vấn đề về khả năng chạy vào giới hạn ARG_MAX. Cái thứ hai gần với những gì tôi đề xuất, nhưng không có lý do chính đáng nào để sử dụng xargs
ở đây, chưa kể đến việc sử dụng an toàn và đúng cách xargs
đòi hỏi phải hy sinh tính di động cho một số tùy chọn chỉ GNU ( find -print0 | xargs -0
).