Làm cách nào tôi có thể sử dụng grep để tìm kiếm nhiều thư mục không cần thiết?


20

Nghe có vẻ như tôi đang hỏi điều tương tự như câu hỏi này , nhưng tôi có những yêu cầu khác nhau. Đây là một ví dụ về hệ thống tập tin của tôi:

  • / mã /
    • nội bộ /
      • nhà phát triển
      • chủ yếu/
    • công cộng/
      • nhà phát triển
      • chủ yếu/
      • giải phóng/
    • công cụ/

/code/internal/dev/, /code/public/dev//code/tools/chứa thư mục con cho nhiều dự án. Tôi làm việc gần như độc quyền trong các nhánh dev của /code/internal//code/public/, và tôi thường muốn tìm kiếm một chuỗi văn bản trong các thư mục đó cùng với /code/tools/(không có chi nhánh). Trong các trường hợp này, tôi phải thực hiện ba lệnh riêng biệt:

$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/

Tôi muốn biết nếu có một lệnh duy nhất để làm điều này. Nếu không, rất có thể tôi sẽ cần phải viết một tập lệnh bash đơn giản.

Câu trả lời:


38

Bạn có thể nối một số đường dẫn để grep tìm kiếm:

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/

Điều này quá rõ ràng. Tại sao tôi không nghĩ về điều này?!
David Kennedy

Trên thực tế, điều này đưa ra một lỗi grep: /code/internal/dev/*.cs: No such file or directorytrừ khi tôi loại bỏ *.cskhỏi lệnh. Đây là lỗi của tôi vì tôi đặt *.cscâu hỏi ban đầu.
David Kennedy

14

Nếu bạn muốn sử dụng tối đa các ký tự đại diện (và hệ thống phân cấp bạn đã đăng hoàn tất), bạn có thể làm

grep -r "some string" /code/{*/dev,tools}/*.cs

Giải trình:

Bước đầu tiên được thực hiện là mở rộng danh sách giằng. foo{bar,baz}quxmở rộng đến foobarqux foobazqux. Đó là, có một từ riêng biệt được tạo cho từng mục được phân tách bằng dấu phẩy trong danh sách, với phần tiền tố và phần hậu tố được đính kèm với mỗi mục. Bạn có thể thấy cách nó hoạt động bằng cách làm

echo A{1,2,3,4}B

đầu ra nào

A1B A2B A3B A4B

Lưu ý rằng điều này cũng hoạt động với nhiều dấu ngoặc nhọn, và cũng với các đối số trống; ví dụ

echo {,1,2}{0,1,2}:{2,3}

cho

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3

Vì vậy, sau khi mở rộng cú đúp, lệnh của bạn trông như thế này:

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs

Bước tiếp theo là mở rộng ký tự đại diện. Bạn đã biết rằng về *.csphần này, nhưng nó cũng hoạt động cho các thư mục trung gian; hơn nữa, nếu /theo sau, chỉ có các thư mục được khớp. Do đó, được phân cấp (và tạo tên tệp cho các .cstệp), bạn sẽ nhận được lệnh:

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs

Chỉ sau khi tất cả điều này đã xảy ra, grepđược gọi với danh sách các đối số này (lưu ý rằng điều tương tự cũng xảy ra với các lệnh ban đầu của bạn; grepkhông bao giờ được nhìn thấy *; mở rộng hoàn toàn được thực hiện bashtrước khi gọi grep).

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.