Với find
:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type f
là chỉ tìm kiếm trong các tệp thông thường (cũng không bao gồm các liên kết tượng trưng ngay cả khi chúng trỏ đến các tệp thông thường). Nếu bạn muốn tìm kiếm trong bất kỳ loại tệp nào ngoại trừ các thư mục (nhưng hãy cẩn thận có một số loại tệp như fifos hoặc / dev / zero bạn thường không muốn đọc), thay thế -type f
bằng GNU cụ thể ! -xtype d
( -xtype d
khớp với các tệp của thư mục loại sau khi phân giải symlink)).
Với GNU grep
:
grep -r pattern /the/dir
(nhưng hãy cẩn thận, trừ khi bạn có phiên bản GNU grep gần đây, nó sẽ theo các liên kết tượng trưng khi đi xuống thư mục). Các tệp không thường xuyên sẽ không được tìm kiếm trừ khi bạn thêm -D read
tùy chọn. Các phiên bản gần đây của GNU grep
vẫn sẽ không tìm kiếm bên trong symlink.
Các phiên bản GNU rất cũ find
không hỗ trợ {} +
cú pháp tiêu chuẩn , nhưng ở đó bạn có thể sử dụng phi tiêu chuẩn:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
Biểu diễn có khả năng bị ràng buộc I / O. Đó là thời gian để thực hiện tìm kiếm sẽ là thời gian cần thiết để đọc tất cả dữ liệu đó từ bộ lưu trữ.
Nếu dữ liệu nằm trên một mảng đĩa dự phòng, việc đọc một số tệp tại một thời điểm có thể cải thiện hiệu suất (và có thể làm giảm chúng theo cách khác). Nếu các màn trình diễn không bị ràng buộc I / O (vì ví dụ, tất cả dữ liệu nằm trong bộ đệm) và bạn có nhiều CPU, đồng thời cũng greps
có thể giúp ích. Bạn có thể làm điều đó với tùy chọn xargs
của GNU -P
.
Chẳng hạn, nếu dữ liệu nằm trên mảng RAID1 có 3 ổ đĩa hoặc nếu dữ liệu nằm trong bộ đệm và bạn có 3 CPU có thời gian dự phòng:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(ở đây sử dụng -n1000
để sinh ra một grep
1000 tệp mới, tối đa 3 tệp chạy song song cùng một lúc).
Tuy nhiên, lưu ý rằng nếu đầu ra của grep
được chuyển hướng, bạn sẽ kết thúc với đầu ra xen kẽ xấu từ 3 grep
quy trình, trong trường hợp đó bạn có thể muốn chạy nó dưới dạng:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(trên hệ thống GNU hoặc FreeBSD gần đây) hoặc sử dụng --line-buffered
tùy chọn GNU grep
.
Nếu pattern
là một chuỗi cố định, việc thêm -F
tùy chọn có thể cải thiện vấn đề.
Nếu đó không phải là dữ liệu ký tự nhiều byte hoặc nếu phù hợp với mẫu đó, thì dữ liệu đó có phải là ký tự nhiều byte hay không, sau đó:
cd /the/dir &&
LC_ALL=C grep -r pattern .
có thể cải thiện hiệu suất đáng kể.
Nếu bạn thường xuyên thực hiện các tìm kiếm như vậy, thì bạn có thể muốn lập chỉ mục dữ liệu của mình bằng một trong nhiều công cụ tìm kiếm ngoài kia.
find
vớixargs
hoặcgrep -R