Có, bạn có thể grep
/dev/sda1
và /proc
có lẽ bạn không muốn. Chi tiết hơn:
Có, bạn có thể chạy grep nội dung nhị phân của /dev/sda1
. Nhưng, với các đĩa cứng lớn hiện đại, việc này sẽ mất một thời gian rất dài và kết quả có thể không hữu ích.
Có, bạn có thể grep nội dung của /proc
nhưng lưu ý rằng bộ nhớ máy tính của bạn được ánh xạ trong đó dưới dạng tệp. Trên một máy tính hiện đại có RAM gigabyte, điều này sẽ mất nhiều thời gian để grep và, một lần nữa, kết quả có thể không hữu ích.
Như một ngoại lệ, nếu bạn đang tìm kiếm dữ liệu trên đĩa cứng có hệ thống tệp bị hỏng, bạn có thể chạy grep something /dev/sda1
như một phần của nỗ lực khôi phục dữ liệu của tệp.
Các tập tin có vấn đề khác trong /dev
Các đĩa cứng và phân vùng đĩa cứng bên dưới /dev
có thể, nếu một người có đủ kiên nhẫn, được đưa vào. Tuy nhiên, các tệp khác (mẹo mũ: user2313067 ) có thể gây ra sự cố:
/dev/zero
là một tập tin có độ dài vô hạn. May mắn thay, grep
(ít nhất là phiên bản GNU) đủ thông minh để bỏ qua nó:
$ grep something /dev/zero
grep: input is too large to count
/dev/random
và /dev/urandom
cũng là vô hạn. Lệnh grep something /dev/random
sẽ chạy mãi mãi trừ khi grep
được báo hiệu dừng lại.
Nó có thể hữu ích để grep /dev/urandom
khi tạo mật khẩu. Ví dụ, để lấy năm ký tự chữ và số ngẫu nhiên:
$ grep --text -o '[[:alnum:]]' /dev/urandom | head -c 10
G
4
n
X
2
Điều này không phải là vô hạn bởi vì, sau khi nó đã nhận đủ ký tự, head
đóng đường ống khiến grep chấm dứt.
Vòng lặp vô hạn
"... liên kết ... tạo các vòng lặp vô hạn khi đi qua ..."
Grep (ít nhất là phiên bản GNU) đủ thông minh để không làm điều đó. Hãy xem xét hai trường hợp:
Với -r
tùy chọn, grep không tuân theo các liên kết tượng trưng trừ khi chúng được chỉ định rõ ràng trên dòng lệnh. Do đó, các vòng lặp vô hạn là không thể.
Với -R
tùy chọn, grep thực hiện theo các liên kết tượng trưng nhưng nó kiểm tra chúng và từ chối bị cuốn vào một vòng lặp. Để minh họa:
$ mkdir a
$ ln -s ../ a/b
$ grep -R something .
grep: warning: ./a/b: recursive directory loop
Không bao gồm các thư mục có vấn đề từ grep -r
Bên cạnh đó, grep
cung cấp một cơ sở hạn chế để ngăn grep tìm kiếm các tệp hoặc thư mục nhất định. Ví dụ, bạn có thể loại trừ tất cả các thư mục được đặt tên proc
, sys
và dev
từ tìm kiếm đệ quy grep với:
grep --exclude-dir proc --exclude-dir sys --exclude-dir dev -r something /
Ngoài ra, chúng ta có thể loại trừ proc
, sys
và dev
sử dụng những đống mở rộng của bash:
shopt -s extglob
grep -r something /!(proc|sys|dev)
grep
tìm kiếm một tệp trong/proc
đó dẫn đến bộ nhớ được ánh xạ, có thể xảy ra việcgrep
chạm vào EOF bên trong bộ nhớ (ngẫu nhiên) và diễn giải dữ liệu sau dưới dạng Tên tệp mới để tìm kiếm? Tôi đã bắt đầu đọcgrep
mã nguồn, nhưng tôi đoán tôi sẽ không thấy quá nhiều trong đó.