Câu trả lời:
Sử dụng -ocờ giữa các tham số khác nhau.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \) hoạt động như một lá bùa.
LƯU Ý Có phải là một không gian giữa khung và nội dung của nó hoặc nó sẽ không làm việc.
Giải trình:
type -f - chỉ tìm kiếm tệp (không phải thư mục)\(- cần thiết type -fđể áp dụng cho tất cả các đối số-o - toán tử OR logic-iname- thích -name, nhưng trận đấu không phân biệt chữ hoa chữ thườngtype -fkhông mở rộng và áp dụng cho cả hai biểu thức mà không có dấu ngoặc đơn, Vì vậy, find ./ -type f -iname \*.jpg -o -type f -iname \*.pngcũng làm việc ... mặc dù nó là hai nhân vật còn :-)
a * b + clà khác vớia * (b + c)
Bạn có thể kết hợp các tiêu chí với -onhư đề xuất của Shadur . Lưu ý rằng -ocó độ ưu tiên thấp hơn vị trí kề nhau, vì vậy bạn có thể cần dấu ngoặc đơn.
find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \) # all .jpg or .png images modified in the past week
Trên Linux, bạn có thể sử dụng -regexđể kết hợp các tiện ích mở rộng theo cách chặt chẽ hơn. Cú pháp regrec mặc định là Emacs ( regexps cơ bản cộng với một vài phần mở rộng như \|để thay thế); có một tùy chọn để chuyển sang regexps mở rộng .
find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'
Trên FreeBSD, NetBSD và OSX, bạn có thể sử dụng -regexkết hợp với các biểu -Ethức chính mở rộng.
find -E . -regex '.*\.(jpg|png)'
-inamethay vì -name- sau đó bạn cũng sẽ chụp image.JPGvàimage.PnG
Điều này đúng hơn:
find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
-iregextrận đấu jpgcũng như JPG Jpg jpGvà như vậy. Tôi nghĩ rằng $không cần thiết.
find -E . -iregex '.*\.(jpg|png|gif)'như thể hiện trong câu trả lời của @ sorin.
Để làm rõ, tùy chọn duy nhất hoạt động trên Linux, Unix và macOS là:
find -E . -regex '.*\.(jpg|png)'
Đó là bởi vì phiên bản OS X hơi khác một chút, nhưng điều quan trọng là viết những thứ hoạt động tốt trên hầu hết các nền tảng.
-type f \( -iname \*.png -o -iname \*.jpg\)nào không hoạt động trên OSX?
find -namemẫu phù hợp với nhiều mẫu tại SO