วิธีรวมเงื่อนไข 2-name เข้ากับ find


94

ฉันต้องการค้นหาไฟล์ที่ไม่ตรงกับ 2 -nameเงื่อนไข ฉันสามารถทำมันได้เช่น:

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

และสิ่งนี้จะให้ผลลัพธ์ที่เหมาะสม แต่ฉันสามารถเข้าร่วม 2 เงื่อนไขกับหรืออย่างใด?

คำตอบ:


46

คุณสามารถทำสิ่งนี้โดยใช้เมื่อตะกี้-regexเช่นกัน: -

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

6
โปรดทราบว่ามีค่าน้อยกว่าแบบพกพา-regex -name
jw013

145

ใช่คุณสามารถ:

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

คำอธิบายจากข้อมูลจำเพาะ POSIX :

! การแสดงออก : การปฏิเสธของหลัก; ผู้ประกอบการไม่ใช่เอก

( นิพจน์ ): จริงถ้านิพจน์เป็นจริง

expression -o expression : การสลับของพรรค ตัวดำเนินการ OR นิพจน์ที่สองจะไม่ถูกประเมินถ้านิพจน์แรกเป็นจริง

โปรดทราบว่าเครื่องหมายวงเล็บทั้งเปิดและปิดนำหน้าด้วยแบ็กสแลช ( \) เพื่อป้องกันการประเมินโดยเชลล์


2
หากคุณกำลังทำ-execหรือดำเนินการใด ๆ กับfindผลลัพธ์อย่าลืม\( \)กำหนดเงื่อนไขทั้งหมดด้วยมิฉะนั้น-execจะใช้กับ-orเกณฑ์ล่าสุดเท่านั้น ในการทำงานกับพวกเขาทั้งหมดให้กำเนิดพวกเขา:find \( <criterion> -o <criterion> \) -exec <command>
Victor Sergienko

25

คุณใกล้จะแก้ปัญหาแล้ว:

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

คุณสามารถรวมตัวดำเนินการตรรกะต่อไปนี้ในลำดับใดก็ได้:

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

6

คุณสามารถใช้นิพจน์ทั่วไปดังใน:

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

แบ็กสแลชเป็นตัวหนี .จับคู่อักขระเดี่ยวและ*ทำหน้าที่จับคู่อักขระก่อนหน้าเป็นศูนย์หรือมากกว่าครั้งดังนั้น.*หมายถึงการจับคู่อักขระศูนย์หรือมากกว่า


1
การเพิ่มคำอธิบายจะทำให้คำตอบของคุณดีขึ้น
NN

คุณถูก. เพิ่มคำอธิบายบางอย่าง
Francesco Turco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.