Làm cách nào tôi có thể sử dụng grep để tìm một từ trong thư mục?


542

Trong Windows, tôi đã thực hiện tìm kiếm để tìm một từ trong thư mục. Tương tự, tôi muốn biết nếu một từ cụ thể xảy ra trong một thư mục chứa nhiều thư mục con và tệp. Các tìm kiếm của tôi cho cú pháp grep cho thấy tôi phải chỉ định tên tệp, nghĩa là grep string filename.

Bây giờ, tôi không biết tên tệp, vậy tôi phải làm gì? Một người bạn đề nghị làm grep -nr string, nhưng tôi không biết điều này có nghĩa là gì và tôi không có kết quả với nó (không có phản hồi nào cho đến khi tôi đưa ra a ctrl + c).

Câu trả lời:


849
grep -nr 'yourString*' .

Dấu chấm ở cuối tìm kiếm thư mục hiện tại. Ý nghĩa cho từng tham số:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Sẽ tìm MobileAppServlet.javahoặc MobileAppServlet.classhoặc MobileAppServlet.txt; 'MobileAppASer*.*'là một cách khác để làm điều tương tự.)

Để kiểm tra thêm các tham số sử dụng lệnh man grep .


14
Kinh doanh với *cái gì? Nó sẽ dẫn đến việc mở rộng ký tự đại diện (nếu có tên tệp khớp với mẫu ký tự đại diện) hoặc grep sẽ lấy nó làm toán tử lặp lại 0 hoặc nhiều hơn cho ký tự trước *.
usta

7
Bây giờ chúng ta hãy xem xét cả hai khả năng grep -nr MobileAppSer* .1. Giả sử chúng ta có 3 file trong thư mục hiện hành phù hợp với MobileAppSer*mô hình wildcard: tên MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Sau đó grepsẽ được gọi như thế này : grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. Nó có nghĩa là tìm kiếm văn bản "MobileAppServlet. Class" trong các tệp MobileAppServlet.java, MobileAppServlet.txt và các nơi khác trong thư mục hiện tại - đây chắc chắn không phải là điều người dùng muốn ở đây.
usta

7
2. Trong trường hợp không có tệp nào trong thư mục hiện tại khớp với MobileAppSer*mẫu ký tự đại diện, grepsẽ nhận được đối số nguyên trạng MobileAppSer*và do đó sẽ lấy nó làm tìm kiếm văn bản "MobileAppSe" theo sau là 0 hoặc nhiều lần xuất hiện của "r", vì vậy nó sẽ cố gắng tìm các văn bản "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr", v.v. trong nội dung tệp của thư mục hiện tại - không phải là những gì người dùng muốn.
usta

5
Đây là một sự lựa chọn đáng ngờ của regex. Usta đã chỉ ra điều này.
kindasimple

117
grep -nr string my_directory

Ghi chú bổ sung: điều này thỏa mãn cú pháp grep [options] string filenamevì trong các hệ thống giống Unix, thư mục là một loại tệp (có thuật ngữ "tệp thông thường" để chỉ cụ thể các thực thể được gọi là "tệp" trong Windows).

grep -nr string đọc nội dung để tìm kiếm từ đầu vào tiêu chuẩn, đó là lý do tại sao nó chỉ chờ ở đó để nhận đầu vào từ bạn và dừng làm như vậy khi bạn nhấn ^ C (nó cũng sẽ dừng trên ^ D, đó là tổ hợp phím cho kết thúc -tập tin).


1
Này, vì vậy nếu tôi muốn tìm kiếm một chuỗi bất kể trường hợp nào, tôi phải làm điều này: grep -i -nr "từ của tôi".
kiki

2
@kiki: Có, tương đương vớigrep -inr "my word" .
usta

16
@kiki: -rđối với grep có nghĩa là tìm kiếm trong thư mục con theo cách đệ quy và -ncó nghĩa là tiền tố mỗi dòng đầu ra với số dòng tương ứng của tệp chứa dòng đó. man grepmô tả tất cả những điều này, và nhiều hơn nữa.
usta

62

GREP : In / Trình phân tích / Bộ xử lý / Chương trình biểu thức chính quy toàn cầu.
Bạn có thể sử dụng để tìm kiếm thư mục hiện tại.
Bạn có thể chỉ định -R cho "đệ quy", có nghĩa là chương trình tìm kiếm trong tất cả các thư mục con và thư mục con của chúng và các thư mục con của thư mục con, v.v.

grep -R "your word" .

-nsẽ in số dòng, nơi nó khớp trong tệp.
-isẽ tìm kiếm không phân biệt chữ hoa chữ thường (chữ in hoa / không viết hoa).

grep -inR "your regex pattern" .

3
./* có nghĩa là tất cả các tệp trong thư mục hiện tại, -R có nghĩa là đệ quy (tìm kiếm thư mục con, v.v.)
Stefan Steiger

25
grep -nr search_string search_dir

sẽ thực hiện RECURSIVE (nghĩa là thư mục và tất cả các thư mục con của nó) tìm kiếm search_ chuỗi. (như đã trả lời đúng bởi usta).

Lý do bạn không nhận được bất kỳ câu trả lời nào với đề xuất của bạn bè về:

grep -nr string

là bởi vì không có thư mục được chỉ định. Nếu bạn đang ở trong thư mục mà bạn muốn thực hiện tìm kiếm, bạn phải làm như sau:

grep -nr string .

Điều quan trọng là bao gồm '.' ký tự, vì điều này cho grep tìm kiếm thư mục NÀY.


Xin chào, tôi phải làm gì, nếu tôi phải tìm kiếm 2 từ có khoảng trắng ở giữa? Các từ nên được chỉ định trong dấu ngoặc kép? tức là grep -nr "từ của tôi".
kiki

24

Ngoài ra còn có:

find directory_name -type f -print0 | xargs -0 grep -li word

nhưng đó có thể là một chút nhiều cho người mới bắt đầu.

findlà một walker / lister mục đích chung, -type fcó nghĩa là "tìm kiếm các tệp đơn giản hơn là các thư mục và các ống có tên và những gì có bạn", -print0có nghĩa là "in chúng trên đầu ra tiêu chuẩn bằng cách sử dụng các ký tự null". Đầu ra từ findđược gửi đến xargs -0và lấy đầu vào tiêu chuẩn của nó theo từng khối (để tránh giới hạn độ dài dòng lệnh) bằng cách sử dụng các ký tự null làm dấu tách bản ghi (thay vì dòng mới tiêu chuẩn) và áp dụng grep -li wordcho từng bộ tệp. Trên grep, -lcó nghĩa là "liệt kê các tệp phù hợp" và -icó nghĩa là "không phân biệt chữ hoa chữ thường"; bạn thường có thể kết hợp các tùy chọn ký tự đơn để bạn sẽ thấy -lithường xuyên hơn -l -i.

Nếu bạn không sử dụng -print0-0sau đó bạn sẽ gặp vấn đề với tên tệp chứa khoảng trắng, vì vậy sử dụng chúng là một thói quen tốt.


1
@mmmshuddup: Cảm ơn. Tôi cảm thấy tồi tệ nếu tôi không đưa ra lời giải thích như một phần của câu trả lời, đặc biệt là khi làm việc với người mới bắt đầu.
mu quá ngắn

1
Đó là những gì tôi đã đánh giá cao nhất trên trang web này. Điều quan trọng cần nhớ là tất cả chúng ta đều là người mới bắt đầu một lần và không dễ để đến với thế giới công nghệ!
Có Barry

Tôi có thể loại trừ các thư mục nhất định? @muistooshort
Ferologics

@Ferologics Cần có, kiểm tra man findtừ dòng lệnh để xem các tùy chọn findhỗ trợ của bạn .
mu quá ngắn

8

Tại sao không thực hiện tìm kiếm đệ quy để tìm tất cả các phiên bản trong thư mục con:

grep -r 'text' *

Công việc này như một cái duyên vậy.


1
Không cần trích dẫn chuỗi tìm kiếm không có ký tự đặc biệt như dấu cách
Scott Stensland

5
  1. grep -r "yourstring" * Sẽ tìm thấy "chuỗi của bạn" trong bất kỳ tệp và thư mục

Bây giờ nếu bạn muốn tìm hai chuỗi khác nhau cùng một lúc, bạn luôn có thể sử dụng tùy chọn E và thêm từ cho tìm kiếm. ví dụ sau giờ nghỉ

  1. grep -rE "yourstring|yourotherstring|$" *sẽ tìm kiếm danh sách các vị trí yourstringhoặc yourotherstringkhớp

4

Một tùy chọn khác mà tôi muốn sử dụng:

find folder_name -type f -exec grep your_text  {} \;

-type f chỉ trả về cho bạn các tệp và không phải thư mục

-exec và {} chạy grep trên các tệp được tìm thấy trong tìm kiếm (cú pháp chính xác là "-exec lệnh {}").


4
grep -R "string" /directory/

-R cũng theo symlink khi -r không.


2

Câu trả lời bạn đã chọn là tốt và nó hoạt động, nhưng đó không phải là cách chính xác để làm điều đó, bởi vì:

grep -nr yourString* .

Điều này thực sự tìm kiếm chuỗi "yourStrin""g"0 hoặc nhiều lần.

Vì vậy, cách thích hợp để làm điều đó là:

grep -nr \w*yourString\w* .

Lệnh này tìm kiếm chuỗi với bất kỳ ký tự nào trước và sau trên thư mục hiện tại.


2
tuy nhiên grep -nr yourStringcũng hoạt động, vì nó tìm kiếm trần yourStringở bất cứ đâu trong dòng (hoặc ít nhất là trên hệ thống của tôi, OSX Lion)
theheadofabroom

1

Tương tự như câu trả lời được đăng bởi @eLRuLL, một cách dễ dàng hơn để chỉ định tìm kiếm tôn trọng ranh giới từ là sử dụng -wtùy chọn:

grep -wnr "yourString" .

Trong dấu nhắc cmd hoặc thiết bị đầu cuối windows, thuật ngữ grep không được nhận ra
kouty

@kouty grep là một lệnh Unix. itechtics.com/USE-findstr-windows
Hugo M. Zuleta

1

Chạy (terminal) lệnh sau trong thư mục. Nó cũng sẽ kiểm tra đệ quy bên trong các thư mục con.

grep -r 'your string goes here' * 

0

Các hình mẫu sau đệ quy cho your search stringtrong *.xml*.jsfile ở đâu đó nằm bên trong các thư mục path1, path2path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

Vì vậy, bạn có thể tìm kiếm trong một tập hợp con của các tệp cho nhiều thư mục, chỉ cần cung cấp các đường dẫn ở cuối.


-4

Đừng sử dụng grep. Tải xuống Silver Searcher hoặc ripgrep . Cả hai đều nổi bật và nhanh hơn grep hoặc ack với hàng tấn tùy chọn.


2
Đây có thể là những công cụ tuyệt vời nhưng điều này không trả lời tôi sẽ sử dụng những công cụ này như thế nào để thực hiện những gì OP đang yêu cầu.
jmathew
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.