ใช้
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แต่คุณลืมหนึ่งในสิ่งที่สหกรณ์ต้องการที่จะหาไฟล์ที่ลงท้ายด้วย