2012-09-04 16 views
6

Tôi có một cấu trúc thư mục như thế này (đó là một đoạn nhỏ):Cách tìm/grep tất cả các đường dẫn trong đó tên thư mục khớp với "x" nhưng không phải "y" trên * nix?

└── test 
   └── cases 
      └── model 
         ├── client 
         │ ├── socketsTest.coffee 
         ├── server 
         │   └── socketsTest.coffee 
         └── shared 
          └── findersTest.coffee 

Câu hỏi là, làm thế nào để bạn liệt kê tất cả những con đường mà kết thúc bằng .coffee và không tồn tại trong thư mục client?

Sau đây lệnh trả về tất cả các file phù hợp với .coffee mà tồn tại trong thư mục server:

find test -name "*Test.coffee" | egrep '/*server*/' 

Nhưng những gì tôi thực sự cần là một regex phù hợp với tất cả mọi thứ trừ những gì trong thư mục client.

Cách sạch nhất để thực hiện điều này trên * nix là gì? Mục tiêu cuối cùng là để trả hồ sơ không phải bên trong một thư mục client, vì vậy đối với cây trên đó sẽ là:

$ <find files except those a client folder> 
test/cases/model/server/socketsTest.coffee 
test/cases/model/shared/findersTest.coffee 

Tôi đã cố gắng làm một cái gì đó như thế này nhưng không có may mắn:

find test -name "*Test.coffee" | egrep '*model/[^client]*' 

Trả lời

10

Bạn có thể sử dụng -prune hành động bỏ qua các thư mục. -o có nghĩa là "hoặc", vì vậy hãy đọc như ", nếu nó được đặt tên là khách hàng prune nó, nếu không in các tập tin có tên *.coffee".

find test -name client -prune -o -name '*.coffee' -print 

Hoặc bạn có thể sử dụng một thử nghiệm kép, đó là dễ dàng hơn để đọc nhưng hơi kém hiệu quả, vì nó sẽ recurse vào client/ thư mục, trong khi người đầu tiên tránh chúng hoàn toàn.

find test -name '*.coffee' ! -wholename '*/client/*' 
+0

Awesome, cảm ơn bạn ! Cả hai đều mới đối với tôi. –

1

Tôi muốn câu trả lời thứ nhất là số -prune mà John Kugelman cung cấp.

Một cách khác để giải quyết vấn đề này bằng grep là sử dụng -v tùy chọn:

find test -name "*Test.coffee" | grep -v client 

-v sẽ đảo ngược mô hình phù hợp, vì vậy tất cả các trận đấu có chứa "khách hàng" sẽ bị loại bỏ