2013-02-11 37 views
7

Để tìm tất cả các tập tin có chứa "foo" trong thư mục hiện hành, tôi sử dụng:tìm tệp mà không chứa một chuỗi

grep -r "foo" . 

Để tìm tất cả các tập tin có chứa "thanh" trong thư mục hiện tại, tôi sử dụng:

grep -r "bar" . 

Nhưng cách tìm tất cả các tệp không chứa 'foo' và 'bar'?

Trả lời

13

Để in dòng không chứa một số chuỗi, bạn sử dụng -v cờ:

grep -r -v "bar" . | grep -v "foo" 

này cung cấp cho bạn tất cả các dòng mà không chứa foo hoặc bar.

Để in tệp không chứa một số chuỗi, bạn sử dụng cờ -L. Để không phù hợp với một số chuỗi, bạn có thể sử dụng biểu thức thông thường với -P cờ (có một số cờ regex bạn có thể sử dụng):

grep -r -L -P "(foo|bar)" . 

này in một danh sách các tập tin mà không chứa foo hoặc bar.

Cảm ơn Anton Kovalenko vì đã chỉ ra điều này.

+3

sai. '-v' là về các dòng không phù hợp đang có mặt, không phải về * các dòng khớp nhau bị thiếu *. –

+0

@AntonKovalenko Bạn nói đúng, tôi đã xóa '-r' trong đường ống. Đối với "các dòng không khớp", đó là những gì OP đang yêu cầu: 'grep -v" foo "' các dòng goves không khớp 'foo'. – alestanis

+0

Anh ta hỏi về các tệp * không chứa * foo và bar * *, không phải về các tệp * chứa một số dòng không phải thanh và một số dòng không phải là foo *. –

1

Với awk, một cái gì đó như:

awk 'BEGIN {f=ARGV[1] ; ff=0} f != FILENAME { if (ff>0) { print f } ; ff=0 ; f=FILENAME } /SEARCHSTRING/ {ff=1} END {if (ff>0) { print f } }' INPUT_FILE_LIST(PATTERN) 

Về cơ bản nó đọc tất cả các tập tin đầu vào và nếu thấy bạn SEARCHSTRING (mà có thể là một regex), nó tiết kiệm mà thông tin. Sau khi hoàn thành tệp hiện tại (hoặc sau tệp cuối cùng), hãy kiểm tra xem tệp có tìm thấy gì không và nếu có, hãy in tên tệp trước đó.

1

Hãy thử bên dưới. điều này sẽ hoạt động

grep -rL -P "(foo | bar)".

3

Hãy thử điều này một:

grep -L -e "foo\|bar" * 
1

đệ quy tìm kiếm danh bạ cho tất cả các file mà không làm chứa XYZ

find . -type f | xargs grep -L "XYZ" 
Các vấn đề liên quan