Câu trả lời:
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\)$'
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.
-exec
hoặc bất kỳ hành động nào khác đối với find
kết quả, hãy nhớ ghi lại \( \)
toàn bộ tiêu chí, nếu không -exec
sẽ chỉ áp dụng cho -or
tiê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>
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
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ự.
-regex
ít di động hơn-name
.