Grep trong các tệp có phần mở rộng cụ thể trong một thư mục


11

Có một lệnh cho phép tìm kiếm một từ khóa trong các tập tin trong một thư mục với phần mở rộng cụ thể không?

Chuỗi grep -irn "string" ./pathcung cấp một tìm kiếm đệ quy cho tất cả các tệp trong thư mục ./path. Yêu cầu cụ thể của tôi là tìm kiếm trong tất cả các tệp ./pathvới phần mở rộng như*.h

Câu trả lời:



10

S et (bật) ion sh ell optglobstar bằng lệnh

    shopt -s globstar

Điều này sẽ gây ra **như là một thành phần tên tệp có nghĩa là tất cả mọi thứ ở đây và bên dưới. Vì vậy, path/**có nghĩa là tất cả mọi thứ trong paththư mục và thư mục con của nó . (Bạn không cần phải nhập ./vào đây.) Sau đó, bạn có thể sử dụng

grep -in "string" path/**/*.h

để tìm kiếm tất cả các .htập tin trong và dưới path.


Bạn có thể u nset tùy chọn với shopt -u.



3

Nếu bạn có thể cài đặt một cái gì đó trên máy của mình, tôi khuyên bạn nên sử dụng ack .

Bạn có thể làm chính xác những gì bạn cần với nó và nhiều hơn nữa. Đối với trường hợp sử dụng của bạn, bạn có thể làm:

# Depending of your system, you have to use one or the other
ack --hh -i string path
ack-grep --hh -i string path
  • --hh bộ lọc trên tập tin h
  • -tôi bỏ qua vụ án

Để tìm bộ lọc tệp nào được hỗ trợ nguyên bản, hãy chạy lệnh ack --help=type.


Ngoài ra còn có ag , một bản sao cũ của ack. Trước đây, vì bộ tính năng của họ đã chuyển hướng phần nào.
8bittree

Tôi không biết ag. Cám ơn vì đã chia sẻ.
AD

3

Cái này thì sao?

find -L ./path -name "*.h" -exec grep -in "string" {} \;

Giải trình:

  • -L: theo liên kết tượng trưng
  • -name: sử dụng dấu hoa thị, bạn có thể mô tả các tiện ích mở rộng
  • -in: giống như đề xuất của bạn, nhưng 'r' được thay thế bằng findlệnh
  • {}: đây là kết quả của findlệnh
  • \; : trong trường hợp bạn kết hợp findvới -exec, đây là công cụ xác định cuối lệnh

1
Làm thế nào để "*.h"làm việc? Tôi đã nghĩ nó cần phải như vậy'*.h'
Joe

Tôi luôn làm việc với dấu ngoặc kép, tôi không nghĩ nó tạo ra sự khác biệt.
Dominique

0

Nếu bạn đang sử dụng gnu grep thì nó có một lá cờ thực hiện chính xác những gì bạn muốn:

grep -irn --include=\*.h "string" path

mặc dù tôi không nghĩ rằng nó có sẵn trong các greps khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.