it-swarm-vi.com

Làm thế nào để tìm kiếm văn bản trong toàn bộ hệ thống tập tin?

Giả sử rằng công cụ grep nên được sử dụng, tôi muốn tìm kiếm chuỗi văn bản "800x600" trong toàn bộ hệ thống tệp.

Tôi đã thử:

grep -r 800x600 /

nhưng nó không hoạt động.

Điều tôi tin rằng lệnh của tôi nên làm là grep đệ quy thông qua tất cả các tệp/thư mục dưới gốc cho văn bản "800x600" và liệt kê kết quả tìm kiếm.

Tôi đang làm gì sai?

56
Level1Coder

Tôi thường sử dụng kiểu lệnh này để chạy grep trên một số tệp:

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

Điều này thực sự làm là tạo một danh sách của mỗi tệp trên hệ thống, và sau đó cho mỗi tệp, thực thi grep với các đối số đã cho và tên của mỗi tệp.

Các -xdev argument cho biết rằng nó phải bỏ qua các hệ thống tệp khác - điều này tốt cho việc tránh các hệ thống tệp đặc biệt như /proc. Tuy nhiên, nó cũng sẽ bỏ qua các hệ thống tập tin bình thường - vì vậy, ví dụ, nếu thư mục/nhà của bạn nằm trên một phân vùng khác, nó sẽ không được tìm kiếm - bạn sẽ cần phải nói find / /home -xdev ....

-type f có nghĩa là chỉ tìm kiếm tệp, vì vậy thư mục, thiết bị và các tệp đặc biệt khác bị bỏ qua (nó vẫn sẽ truy xuất vào thư mục và thực thi grep trên các tệp trong - nó sẽ không thực thi grep trên chính thư mục, cái nào cũng không hoạt động). Và -H tùy chọn để grep bảo nó luôn in tên tệp trong đầu ra của nó.

find chấp nhận tất cả các loại tùy chọn để lọc danh sách các tệp. Ví dụ, -name '*.txt' chỉ xử lý các tệp kết thúc bằng .txt. -size -2M có nghĩa là các tệp nhỏ hơn 2 megabyte. -mtime -5 có nghĩa là các tệp được sửa đổi trong năm ngày qua. Tham gia cùng với -a cho và -o cho hoặc và sử dụng '(' ngoặc đơn ')' đến các biểu thức nhóm (trong dấu ngoặc kép để ngăn Shell diễn giải chúng). Ví dụ:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

Hãy xem man find để xem danh sách đầy đủ các bộ lọc có thể.

68
Richard Downer

Thông thường bạn sẽ không thực sự muốn tìm kiếm MỌI THỨ trên hệ thống. Linux sử dụng các nút tệp cho mọi thứ, vì vậy một số "tệp" không phải là thứ bạn muốn tìm kiếm. Ví dụ /dev/sda là thiết bị khối vật lý cho ổ cứng đầu tiên của bạn. Bạn có thể muốn tìm kiếm các hệ thống tập tin gắn kết chứ không phải thiết bị đĩa thô. Cũng có /dev/random sẽ phun ra dữ liệu ngẫu nhiên mỗi khi bạn đọc nó. Tìm kiếm mà không có nhiều ý nghĩa. Các /proc hệ thống tập tin cũng có vấn đề trong trường hợp của bạn.

Tôi sẽ giới thiệu một trong hai điều.

  1. Đừng tìm kiếm ở root, chỉ tìm kiếm những nơi có thể hữu ích. Tìm kiếm /home hoặc là /usr hoặc là /etc riêng biệt. Thông tin bạn đang tìm kiếm có khả năng thuộc một loại cụ thể, vì vậy dù sao nó cũng có thể nằm trong một thư mục cụ thể. Cài đặt cấu hình phải ở /etc. Tệp dữ liệu cá nhân của bạn phải ở /home. Giới hạn tìm kiếm trong một lĩnh vực chính như thế này sẽ giúp giảm đáng kể các vấn đề của bạn với các greps đệ quy.

  2. Loại trừ các khu vực có vấn đề bằng cách sử dụng --exclude-dir và một loạt những thứ bạn biết bạn không cần như thế này:
    [.__.] grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

Cuối cùng, không có gì lạ khi gặp phải một vài lỗi 'bị từ chối cấp phép' khi thực hiện một grep đệ quy lớn. Trong quá trình sử dụng thông thường, có những tập tin mà người dùng của bạn không thể đọc được. Miễn là đây chỉ là một vài tệp lẻ và không phải là những thứ như thiết bị thô cho ổ đĩa cứng của bạn hoặc toàn bộ hệ thống tệp Proc, bạn chỉ cần bỏ qua các lỗi. Trong thực tế, bạn có thể làm điều này trên dòng lệnh bằng cách gửi tất cả các lỗi vào không bao giờ không bao giờ hạ cánh:

grep -r search_string /path 2> /dev/null
15
Caleb

Để đơn giản, tôi muốn đề xuất ack-grep . Liên kết hiển thị nhiều trường hợp khi ack-grep là một lựa chọn tốt hơn.

Để sử dụng là, sau khi cài đặt:

ack-grep pattern /
3
bbaja42

Một cách khác để xem xét nó là cách này:

grep -r /* | grep "800x600"
2
maniat1k

* sau đó tôi nhận được a/Proc/sysrq-trigger: Lỗi đầu vào/đầu ra

Lệnh của bạn đang hoạt động, bạn đang gặp lỗi này vì bạn đang cố quét các tiến trình đang chạy cho một chuỗi.

Tôi khuyên bạn nên loại trừ các thư mục hệ thống với

grep -exclude-dir = {Proc, sys} "800x600" /

0
Koffee