Làm thế nào để kết hợp 2 điều kiện tên trong tìm?


94

Tôi muốn tìm kiếm các tập tin không phù hợp với 2 -nameđiều kiện. Tôi có thể làm như vậy:

find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"

và điều này sẽ mang lại kết quả phù hợp nhưng tôi có thể tham gia 2 điều kiện này với OR bằng cách nào đó không?

Câu trả lời:


46

Bạn cũng có thể thực hiện việc này bằng cách phủ định -regex: -

 find ./ ! -regex  '.*\(deb\|vmdk\)$'

6
Lưu ý rằng -regexít di động hơn -name.
jw013

145

vâng, bạn có thể:

find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)

Giải thích từ thông số POSIX :

! biểu thức : Phủ định của một chính; toán tử đơn nguyên KHÔNG.

( biểu thức ): Đúng nếu biểu thức là đúng.

biểu thức -o biểu thức : Sự thay thế của bầu cử sơ bộ; toán tử OR. Biểu thức thứ hai sẽ không được đánh giá nếu biểu thức thứ nhất là đúng.

Lưu ý rằng dấu ngoặc đơn, cả mở và đóng, được tiền tố bởi dấu gạch chéo ngược ( \) để ngăn đánh giá bởi trình bao.


2
Nếu bạn đang thực hiện -exechoặc bất kỳ hành động nào khác đối với findkết quả, hãy nhớ ghi lại \( \)toàn bộ tiêu chí, nếu không -execsẽ chỉ áp dụng cho -ortiêu chí cuối cùng . Để làm việc trên tất cả chúng, hãy cho chúng biết:find \( <criterion> -o <criterion> \) -exec <command>
Victor Sergienko

25

Bạn đã gần với giải pháp:

find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"

Bạn có thể kết hợp các toán tử logic sau theo bất kỳ trình tự nào:

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT

6

Bạn có thể sử dụng các biểu thức thông thường như trong:

find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'

Dấu gạch chéo ngược là ký tự thoát; .khớp với một ký tự và *phục vụ để khớp với ký tự trước 0 hoặc nhiều lần hơn, do đó .*có nghĩa là khớp 0 hoặc nhiều ký tự.


1
Thêm một lời giải thích sẽ làm cho câu trả lời của bạn tốt hơn.
NN

Bạn đúng. Đã thêm một số giải thích.
Francesco Turco
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.