Bạn cũng có thể sử dụng globalstar.
Xây dựng grep
các lệnh với find
, như trong câu trả lời của Zanna , là một cách rất mạnh mẽ, linh hoạt và di động để làm điều này (xem thêm câu trả lời của sudodus ). Và muru đã đăng một cách tiếp cận tuyệt vời của việc sử dụng grep
của --include
tùy chọn . Nhưng nếu bạn chỉ muốn sử dụng grep
lệnh và shell của mình, có một cách khác để thực hiện - bạn có thể làm cho chính shell thực hiện đệ quy cần thiết :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
Các -H
làm cho lá cờ grep
hiển thị tên tập tin ngay cả khi chỉ có một tập tin phù hợp được tìm thấy. Bạn có thể vượt qua -a
, -i
và -n
cờ (từ ví dụ của bạn) để grep
là tốt, nếu đó là những gì bạn cần. Nhưng đừng vượt qua -r
hoặc -R
khi sử dụng phương pháp này. Nó là shell mà đệ quy các thư mục trong việc mở rộng mẫu toàn cầu có chứa **
, và khônggrep
.
Các hướng dẫn này là cụ thể cho vỏ Bash. Bash là vỏ người dùng mặc định trong Ubuntu (và hầu hết các hệ điều hành GNU / Linux khác), vì vậy nếu bạn đang sử dụng Ubuntu và không biết shell của bạn là gì, thì gần như chắc chắn là Bash. Mặc dù các shell phổ biến thường hỗ trợ các giao diện ngang qua thư mục **
, chúng không luôn hoạt động theo cùng một cách. Để biết thêm thông tin, xem Stéphane Chazelas 's câu trả lời xuất sắc để Kết quả của ls *, ls ** và ls *** trên Unix.SE .
Làm thế nào nó hoạt động
Bật globstar bash tùy chọn vỏ làm cho **
đường dẫn phù hợp có chứa các dấu phân cách thư mục ( /
). Do đó, nó là một thư mục đệ quy toàn cầu. Cụ thể, như man bash
giải thích:
Khi globstar tùy chọn vỏ được kích hoạt, và * được sử dụng trong một bối cảnh mở rộng tên đường dẫn, hai liền kề * s sử dụng như một mô hình duy nhất sẽ phù hợp với tất cả các file và số không hoặc nhiều thư mục và thư mục con. Nếu theo sau là a, hai * s liền kề sẽ chỉ khớp với các thư mục và thư mục con.
Bạn nên cẩn thận với điều này, vì bạn có thể chạy các lệnh sửa đổi hoặc xóa nhiều tệp hơn bạn dự định, đặc biệt nếu bạn viết **
khi bạn có ý định viết *
. (Nó an toàn trong lệnh này, không thay đổi bất kỳ iles nào.) shopt -u globstar
Tắt tùy chọn shell globalstar trở lại.
Có một vài sự khác biệt thực tế giữa globalstar và find
.
find
linh hoạt hơn nhiều so với thế giới. Bất cứ điều gì bạn có thể làm với globalstar, bạn cũng có thể làm với find
lệnh. Tôi thích Glostar, và đôi khi nó thuận tiện hơn, nhưng Glostar không phải là sự thay thế chung cho find
.
Phương thức trên không nhìn vào bên trong các thư mục có tên bắt đầu bằng a .
. Đôi khi bạn không muốn lặp lại các thư mục như vậy, nhưng đôi khi bạn làm như vậy.
Như với một quả cầu thông thường, shell xây dựng một danh sách tất cả các đường dẫn phù hợp và chuyển chúng dưới dạng đối số cho lệnh của bạn ( grep
) thay cho chính quả cầu đó. Nếu bạn có quá nhiều tệp được gọi là file.txt
lệnh kết quả sẽ quá dài để hệ thống thực thi, thì phương thức trên sẽ thất bại. Trong thực tế, bạn cần (ít nhất) hàng ngàn tệp như vậy, nhưng nó có thể xảy ra.
Các phương thức sử dụng find
không phải chịu sự hạn chế này, bởi vì:
Cách của Zanna xây dựng và chạy một grep
lệnh với nhiều đối số đường dẫn. Nhưng nếu nhiều tệp được tìm thấy nhiều hơn có thể được liệt kê trong một đường dẫn, thì hành động bị +
hủy -exec
bỏ sẽ chạy lệnh với một số đường dẫn, sau đó chạy lại nó với một số đường dẫn khác, v.v. Trong trường hợp grep
ing cho một chuỗi trong nhiều tệp, điều này tạo ra hành vi chính xác.
Giống như phương pháp sao được đề cập ở đây, phương pháp này in tất cả các dòng khớp, với các đường dẫn được đặt trước mỗi đường.
cách của sudodus chạy grep
riêng cho từng file.txt
tìm thấy. Nếu có nhiều tệp, nó có thể chậm hơn một số phương thức khác, nhưng nó hoạt động.
Phương thức đó tìm các tệp và in đường dẫn của chúng, theo sau là các dòng khớp nếu có. Đây là một định dạng đầu ra khác với định dạng được tạo bởi phương pháp của tôi, của Zanna và muru .
Bắt màu với find
Một trong những lợi ích trước mắt của việc sử dụng globalstar là, theo mặc định trên Ubuntu, grep
sẽ tạo ra đầu ra được tô màu. Nhưng bạn có thể dễ dàng có được điều này với find
, quá .
Tài khoản người dùng trong Ubuntu được tạo ra với một bí danh mà làm grep
thực sự chạy grep --color=auto
(chạy alias grep
để xem). Một điều tốt là các bí danh được mở rộng khá nhiều khi bạn phát hành chúng một cách tương tác , nhưng điều đó có nghĩa là nếu bạn muốn find
gọi grep
bằng --color
cờ, bạn sẽ phải viết nó một cách rõ ràng. Ví dụ:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +