ฉันต้องการค้นหาไฟล์ที่ไม่ตรงกับ 2 -name
เงื่อนไข ฉันสามารถทำมันได้เช่น:
find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"
และสิ่งนี้จะให้ผลลัพธ์ที่เหมาะสม แต่ฉันสามารถเข้าร่วม 2 เงื่อนไขกับหรืออย่างใด?
ฉันต้องการค้นหาไฟล์ที่ไม่ตรงกับ 2 -name
เงื่อนไข ฉันสามารถทำมันได้เช่น:
find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"
และสิ่งนี้จะให้ผลลัพธ์ที่เหมาะสม แต่ฉันสามารถเข้าร่วม 2 เงื่อนไขกับหรืออย่างใด?
คำตอบ:
คุณสามารถทำสิ่งนี้โดยใช้เมื่อตะกี้-regex
เช่นกัน: -
find ./ ! -regex '.*\(deb\|vmdk\)$'
ใช่คุณสามารถ:
find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)
คำอธิบายจากข้อมูลจำเพาะ POSIX :
! การแสดงออก : การปฏิเสธของหลัก; ผู้ประกอบการไม่ใช่เอก
( นิพจน์ ): จริงถ้านิพจน์เป็นจริง
expression -o expression : การสลับของพรรค ตัวดำเนินการ OR นิพจน์ที่สองจะไม่ถูกประเมินถ้านิพจน์แรกเป็นจริง
โปรดทราบว่าเครื่องหมายวงเล็บทั้งเปิดและปิดนำหน้าด้วยแบ็กสแลช ( \
) เพื่อป้องกันการประเมินโดยเชลล์
-exec
หรือดำเนินการใด ๆ กับfind
ผลลัพธ์อย่าลืม\( \)
กำหนดเงื่อนไขทั้งหมดด้วยมิฉะนั้น-exec
จะใช้กับ-or
เกณฑ์ล่าสุดเท่านั้น ในการทำงานกับพวกเขาทั้งหมดให้กำเนิดพวกเขา:find \( <criterion> -o <criterion> \) -exec <command>
คุณใกล้จะแก้ปัญหาแล้ว:
find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"
คุณสามารถรวมตัวดำเนินการตรรกะต่อไปนี้ในลำดับใดก็ได้:
-a -and - operator AND
-o -or - operator OR
! - operator NOT
คุณสามารถใช้นิพจน์ทั่วไปดังใน:
find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'
แบ็กสแลชเป็นตัวหนี .
จับคู่อักขระเดี่ยวและ*
ทำหน้าที่จับคู่อักขระก่อนหน้าเป็นศูนย์หรือมากกว่าครั้งดังนั้น.*
หมายถึงการจับคู่อักขระศูนย์หรือมากกว่า
-regex
-name