ฉันต้องการค้นหาไฟล์ png AND jpg ทั้งหมดและใช้คำสั่งต่อไปนี้และจะไม่มีการส่งคืนผลลัพธ์อย่างไรก็ตามหากฉันแทนที่ -a
กับ -o
มันแสดงรายการไฟล์ให้ฉัน ทำไมถึงเป็นอย่างนั้น?
`find . -maxdepth 1 \( -iname \*\.png -a -iname \*\.jpg \)
ฉันต้องการค้นหาไฟล์ png AND jpg ทั้งหมดและใช้คำสั่งต่อไปนี้และจะไม่มีการส่งคืนผลลัพธ์อย่างไรก็ตามหากฉันแทนที่ -a
กับ -o
มันแสดงรายการไฟล์ให้ฉัน ทำไมถึงเป็นอย่างนั้น?
`find . -maxdepth 1 \( -iname \*\.png -a -iname \*\.jpg \)
คำตอบ:
ข้อผิดพลาดทางตรรกะ สิ่งที่คุณกำลังบอก find
คือ:
ค้นหาในโฟลเดอร์นี้ไฟล์ทั้งหมดที่เป็น (PNG และ JPG)
แต่แน่นอนว่าไม่มีไฟล์ที่เป็น ทั้งสอง ในเวลาเดียวกันซึ่งเป็นสาเหตุที่ -o
การทำงาน:
ค้นหาในโฟลเดอร์นี้ไฟล์ทั้งหมดที่เป็น (PNG หรือ JPG)
เมื่อสร้างแบบสอบถามเหล่านี้เพียงแค่จินตนาการ find
ผ่านแต่ละไฟล์เพื่อทดสอบ จากนั้นนำไปใช้ ตรรกะบูลีน . ตัวอย่างเช่น:
พบไฟล์. txt มันไม่ใช่ PNG (เท็จ) และไม่ใช่ JPG (เท็จ) ดังนั้น false & amp; & amp; เท็จ เท่ากับเท็จ
พบว่าเป็นไฟล์. png มันเป็น PNG (จริง) และไม่ใช่ JPG (เท็จ) ดังนั้น จริง & amp; & amp; เท็จ เท่ากับเท็จ
พบว่าเป็นไฟล์. jpg ไม่ใช่ PNG (เท็จ) และเป็น JPG (จริง) ดังนั้น false & amp; & amp; จริง เท่ากับเท็จ
หากคุณใช้ -o
สวิตช์และพบไฟล์. png จากนั้นเป็น PNG (จริง) และไม่ใช่ JPG (false) ดังนั้น จริง | | เท็จ เท่ากับจริง
-o
แทน -a
เหมือนที่ฉันพูด หากคุณไม่ได้รับผลลัพธ์ใด ๆ แสดงว่าคุณค้นหาผิดไดเรกทอรี
-iname \*\.png
ถูกมองว่าเป็น 1 ข้อความค้นหาตามด้วยคำถามที่สอง -iname \*\.jpg
?
find
จะประเมิน "ข้อความค้นหา" ทั้งสองว่าเป็นความจริงหรือเท็จแล้วรวมผลลัพธ์ของทั้งสองเข้ากับการทดสอบทางตรรกะ หากผลคือ true
พบไฟล์ อย่างที่ฉันเขียนไว้ในตัวอย่างถ้าการทดสอบครั้งแรกคือ true
("มันคือ PNG!") และอันที่สองคือ false
("ไม่ใช่ JPG!") สิ่งนี้จะประเมิน true
เมื่อรวมกับตรรกะ or
.
-a เป็นตรรกะและหมายถึงชื่อไฟล์จะต้องลงท้ายด้วย. PNG และ. JPG ให้เป็นจริง
-o เป็นตรรกะแบบรวมหรือหมายถึงชื่อไฟล์จะต้องลงท้ายด้วย. PNG หรือ. JPG (หรือทั้งคู่) เป็นจริง
-o
แทน -a
ตามที่ฉันเขียนไว้ในคำตอบของฉันเช่นกัน