Sử dụng `find` cho nhiều phần mở rộng tệp


16

Tôi đang sử dụng lệnh sau để đếm các dòng văn bản trong tệp JAVA:

find . -name '*.java' | xargs wc -l

Làm cách nào tôi có thể sửa đổi các findtham số lệnh để khớp với nhiều phần mở rộng tệp? Ví dụ: tôi muốn sử dụng thao tác trên cho các tệp CPP, C và H.


Câu hỏi này thực sự là về findlệnh, vì đó là nơi bạn đang tìm kiếm các tệp phù hợp.
iglvzx

1
Ngoài ra, sử dụng find -print0 | xargs -0cấu trúc hoặc thậm chí tốt hơn và đơn giản hơn : find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +. Điều này sẽ tránh mọi vấn đề về tên tệp (khoảng trắng, dòng mới, v.v.) và (rất) tùy chỉnh tốt.
Daniel Andersson

Câu trả lời:


16

Sử dụng -otùy chọn cho OR. Ví dụ, điều này sẽ liệt kê .cpp, .c.hcác tập tin:

find . -name \*.cpp -o -name \*.c -o -name \*.h

Ah. Các *nhu cầu không còn để được thoát nếu định dạng mã. Hoàn toàn bỏ qua điều đó. :)
iglvzx

Đúng, phải mất ba lần chỉnh sửa bởi hai người nhưng chúng tôi đã nhận được.
JOTN

2
Điều này không hoạt động với tôi trên OSX (chỉ khớp với tên cuối * .ext) - Tôi đã phải sử dụng dấu ngoặc đơn theo đề xuất của @smokingun bên dưới.
Gilead

2

Bạn sẽ cần sử dụng tùy chọn -o. Ví dụ, câu lệnh dưới đây tìm thấy tất cả các tệp png, jpg và gif trong một thư mục.

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

Tôi sử dụng tùy chọn -iname để trận đấu không phân biệt chữ hoa chữ thường.


1
iname không có sẵn trên tất cả các phiên bản tìm kiếm.
JOTN


1

Mặc dù tất cả các câu trả lời ít nhiều giống nhau, tôi không tìm thấy chúng có thể đọc được với nhiều toán tử Boolean ở giữa.

Tôi nghĩ rằng đây có thể là giải pháp thanh lịch hơn:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

Chúng ta hãy phá vỡ điều này

  • find . tìm tất cả các tệp đệ quy trong đường dẫn hiện tại (thay đổi một số đường dẫn khác nếu bạn cần)
  • -type fthu hẹp tìm kiếm chỉ với các tệp (không tăng quá nhiều tốc độ, nhưng vẫn ...)
  • | grep -ETôi sử dụng này để có được grep nhận hoặc ( |) điều hành trong Mac OS X trong đó sử dụng FreeBSD grep , GNU grep không cần điều đó (check in của bạn mantập tin).
  • "\.java$|\.cpp$|\.c$"biểu thức chính quy trong đó bao gồm các file có tên đầu với .java, .cpp.c(add cái bạn cần)

Sau đó, bạn có thể dẫn danh sách kết quả để xử lý thêm, ví dụ:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

Ví dụ này loại bỏ CRLFdòng kết thúc DOS / Windows cho OS X / Linux LF(đây cũng là sedcú pháp OS X , kiểm tra thông tin cụ thể về phiên bản của bạn).


Tôi muốn tìm tất cả các loại tệp video bằng 25 tham số khớp mở rộng khác nhau. Đây là cách tiếp cận duy nhất làm việc cho tôi. (Ubuntu 14.04 LTS)
Elder Geek
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.