2010-05-09 41 views
5

Say cấu trúc thư mục của chúng tôi trông như thế này:Grep: Ngoại trừ một thư mục cụ thể sử dụng

/app 
/app/data 
... 
/app/secondary 
/app/secondary/data 

Tôi muốn đệ quy tìm kiếm /app/data nhưng tôi không muốn tìm kiếm /app/secondary/data.

Từ trong thư mục ứng dụng, lệnh grep của tôi sẽ trông như thế nào?

Trả lời

11

này sẽ làm các trick

grep -r --exclude-dir='secondary/data' PATTERN data 
+2

Chỉ dành cho phiên bản grep grep> = 2.5.1a – rymo

+0

vậy làm cách nào để thực hiện điều đó trước gnu grep 2.5.1a? – simpleuser

+1

'--exclude-dir = 'phụ/dữ liệu' là dự phòng tại đây. Xem câu trả lời của tôi dưới đây. –

2

Tại sao câu trả lời được chấp nhận là sai

Câu trả lời được chấp nhận bởi @seamus là sai vì grep -r --exclude-dir=<glob> trận đấu với tên cơ sở mà theo định nghĩa không thể chứa dấu gạch chéo (slashes biến nó thành một no-op một cách hiệu quả vì không có tên cơ sở nào phù hợp).

Từ GNU Grep Manual:

--exclude-dir = glob

... Khi tìm kiếm đệ quy, bỏ qua bất kỳ thư mục con có tên cơ sở trận glob ...

Tại sao lại thực hiện nhiệm vụ ion có lẽ là sai

Tôi nghĩ rằng cấu trúc thư mục của OP không đại diện cho vấn đề cũng vì bởi vì nếu người ta ...

. 
├── app 
   ├── data 
   └── secondary 
    └── data 

... và thư mục hiện hành là app một cách đơn giản có thể làm:

> grep -r <search-pattern> data 

Nó sẽ không tìm kiếm các thư mục secondary như nó không phải bên data.

gì câu hỏi dự định có thể là

Với cấu trúc thư mục với lồng nhau data thư mục làm thế nào để tìm trong các cấp cao nhất data nhưng không phải trong thư mục lồng nhau.

. 
└── data 
    ├── file.txt 
    ├── folder1 
    │   └── folder2 
    │    ├── data 
    │    │   └── file.txt 
    │    └── file.txt 
    └── folder3 
     ├── data 
     │   └── file.txt 
     └── file.txt 

gì câu trả lời sẽ là

> grep -r --exclude-dir='data' <search-pattern> data/* 

Lưu ý * ở cuối. Nếu bỏ qua thư mục data cấp cao nhất sẽ không được tìm kiếm.

+0

'phù hợp với tên cơ sở' quan trọng cần biết ở đây. Sau khi xem xét một vài câu trả lời SO, đây là câu trả lời duy nhất chỉ ra rằng – Jeremy

Các vấn đề liên quan