उपयोग
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
।