ใช้
find \( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
หรือ
find \( -path "./tmp" -o -path "./scripts" \) -prune -false -o -name "*_peaks.bed"
หรือ
find \( -path "./tmp" -path "./scripts" \) ! -prune -o -name "*_peaks.bed"
ลำดับเป็นสิ่งสำคัญ จะประเมินจากซ้ายไปขวา เริ่มต้นด้วยการยกเว้นเส้นทางเสมอ
คำอธิบาย
อย่าใช้-not
(หรือ!
) เพื่อยกเว้นไดเร็กทอรีทั้งหมด ใช้-prune
. ตามที่อธิบายไว้ในคู่มือ:
−prune The primary shall always evaluate as true; it
shall cause find not to descend the current
pathname if it is a directory. If the −depth
primary is specified, the −prune primary shall
have no effect.
และใน GNU ค้นหาคู่มือ:
-path pattern
[...]
To ignore a whole
directory tree, use -prune rather than checking
every file in the tree.
อันที่จริงถ้าคุณใช้ค้นหาจะประเมินการแสดงออกสำหรับแต่ละโหนดภายใต้-not -path "./pathname"
"./pathname"
หานิพจน์เป็นเพียงการประเมินเงื่อนไข
\( \)
- การดำเนินการแบบกลุ่ม (คุณสามารถใช้ได้-path "./tmp" -prune -o -path "./scripts" -prune -o
แต่จะละเอียดกว่า)
-path "./script" -prune
- ถ้า-path
ผลตอบแทนที่เป็นความจริงและเป็นไดเรกทอรีกลับมาจริงสำหรับไดเรกทอรีที่และไม่ได้ลงไปในมัน
-path "./script" ! -prune
- ประเมินเป็น(-path "./script") AND (! -prune)
. มันเปลี่ยน "เสมอจริง" ของพรุนเป็นเท็จเสมอ หลีกเลี่ยงการพิมพ์"./script"
ที่ตรงกัน
-path "./script" -prune -false
- ตั้งแต่-prune
เสมอกลับจริงคุณสามารถทำตามมันด้วยจะทำเช่นเดียวกันกว่า-false
!
-o
- หรือตัวดำเนินการ หากไม่มีการระบุตัวดำเนินการระหว่างสองนิพจน์จะมีค่าเริ่มต้นเป็นตัวดำเนินการ AND
ดังนั้นจึง\( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
ขยายเป็น:
[ (-path "./tmp" OR -path "./script") AND -prune ] OR ( -name "*_peaks.bed" AND print )
การพิมพ์มีความสำคัญที่นี่เนื่องจากไม่มีการขยายเป็น:
{ [ (-path "./tmp" OR -path "./script" ) AND -prune ] OR (-name "*_peaks.bed" ) } AND print
-print
ถูกเพิ่มโดยการค้นหา - นั่นคือเหตุผลที่ส่วนใหญ่คุณไม่จำเป็นต้องเพิ่มในนิพจน์ของคุณ และตั้งแต่-prune
คืนค่าจริงมันจะพิมพ์ "./script" และ "./tmp"
ไม่จำเป็นสำหรับคนอื่น ๆ เพราะเราเปลี่ยน-prune
ไปส่งคืนเท็จเสมอ
คำแนะนำ: คุณสามารถใช้find -D opt expr 2>&1 1>/dev/null
เพื่อดูว่ามีการเพิ่มประสิทธิภาพและขยายอย่างไร
find -D search expr 2>&1 1>/dev/null
เพื่อดูว่ามีการตรวจสอบเส้นทางใด
_peaks.bed
แต่คุณลืมหนึ่งในสิ่งที่สหกรณ์ต้องการที่จะหาไฟล์ที่ลงท้ายด้วย