Cách sử dụng lệnh find để tìm kiếm nhiều tiện ích mở rộng


Câu trả lời:


153

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 Ý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ường

Bạn có cần dấu ngoặc đơn. Lệnh làm việc cho tôi mà không có họ. Họ có cần cho một số vỏ?
MikeD

2
@miked Lệnh sẽ "hoạt động" mà không có chúng, vâng, nhưng bạn sẽ nhận được các lượt truy cập vào các thư mục kết thúc bằng .png cũng như các tệp kết thúc bằng .jpg, không chính xác như dự định.
Shadur

1
Cảm ơn đã làm rõ! Các type -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 :-)
MikeD

2
Đó là vấn đề ưu tiên của nhà điều hành. Giống như a * b + clà khác vớia * (b + c)
Shadur

2
@jdhao Bắt tốt, sửa đổi.
Shadur

86

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)'

Luôn luôn tốt hơn để sử dụng -inamethay vì -name- sau đó bạn cũng sẽ chụp image.JPGimage.PnG
ccpizza

40

Điều này đúng hơn:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'

10
Tại sao bạn nói nó "đúng" hơn?
Kevin

2
@Kevin Tôi đoán vì -iregextrận đấu jpgcũng như JPG Jpg jpGvà như vậy. Tôi nghĩ rằng $không cần thiết.
ott--

Điều này hoạt động tốt trên MinGW .
Peter Mortensen

2
Đầu tiên, bạn bỏ qua thư mục tìm kiếm làm đối số đầu tiên sẽ đưa ra lỗi. Thứ hai, trên OSX thoát dấu ngoặc đơn sẽ không hoạt động và thay vào đó nên sử dụng cách này: find -E . -iregex '.*\.(jpg|png|gif)'như thể hiện trong câu trả lời của @ sorin.
ccpizza

8

Để 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.


2
Cờ -E không hợp lệ để tìm thấy trên Ubuntu 14.04
gogaman

Cờ -E cũng không hợp lệ trên MinGW (ít nhất là phiên bản / cấu hình tôi đã thử (cấu hình mặc định cho một phiên bản cụ thể)).
Peter Mortensen

Phần -type f \( -iname \*.png -o -iname \*.jpg\)nào không hoạt động trên OSX?
Shadur

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.