मैं इस उलझन में था कि क्यों छंटनी निर्देशिकाओं को find
कमांड द्वारा मुद्रित किया जा रहा है , भी, और कुछ अन्य जटिल विवरण कैसे -prune
काम करते हैं, लेकिन कुछ उदाहरणों के साथ यह पता लगाने में सक्षम था।
नीचे दिए गए उदाहरणों को चलाने के लिए निम्नलिखित निर्देशिका और फाइलें बनाएं।
mkdir aa
mkdir bb
touch file1
touch aa/file1
touch bb/file3
इस संरचना को बनाने के लिए:
$ tree
.
├── aa
│ └── file1
├── bb
│ └── file3
└── file1
अब निर्देशिकाओं के नाम खोजने के लिए उपयोग करें aa
। यहाँ कोई समस्या नहीं है।
$ find . -type d -name aa
./aa
आ के अलावा सभी निर्देशिकाओं को देखें और हमें वर्तमान निर्देशिका मिलती है .
और ./bb
इससे भी समझ में आता है।
$ find . -type d ! -name aa
.
./bb
अब तक बहुत अच्छा है, लेकिन जब हम उपयोग करते हैं -prune
, तो उस निर्देशिका को वापस पाते हैं जिसे हम छंटाई कर रहे हैं, जिसने शुरू में मुझे भ्रमित कर दिया था क्योंकि मैं उम्मीद कर रहा था कि यह सभी अन्य निर्देशिकाओं को लौटाएगी न कि किसी को चुभने वाली।
$ find . -type d -name aa -prune
./aa
इसका कारण यह है कि निर्देशिका को वापस लौटाया जा रहा है, -prune
जिसे तिमो के उत्तर में इंगित किए गए मैन पेजों के अनुभाग में नहीं, बल्कि अनुभाग में समझाया गया है EXPRESSIONS
:
यदि अभिव्यक्ति के अलावा कोई क्रिया नहीं है -prune
,
तो -print
उन सभी फ़ाइलों पर किया जाता है जिनके लिए अभिव्यक्ति सत्य है।
जिसका अर्थ है कि, चूंकि अभिव्यक्ति aa
निर्देशिका नाम से मेल खाती है , तो अभिव्यक्ति सही का मूल्यांकन करेगी और इसे मुद्रित किया जाएगा क्योंकि -print
संपूर्ण कमांड के अंत में निहित रूप से जोड़ते हैं । -print
यदि आप जानबूझकर कार्रवाई -o -print
को अंत में खुद से जोड़ते हैं, तो यह एक जोड़ नहीं देगा :
find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3
यहां खोज आदेश -print
अब एक निहित नहीं जोड़ते हैं, और इसलिए जिस निर्देशिका को हम छंटनी कर रहे हैं ( aa
) मुद्रित नहीं होगी।
तो अंत में, यदि हम एक ऐसा क्लॉज जोड़ते हैं जो फाइल्स के पैटर्न फाइल फाइल के साथ खोजता file*
है -o
, तो आपको -print
उस दूसरे क्लॉज के अंत में इस तरह रखना होगा:
find . \( -type d -name aa -prune \) -o \( -type f -name 'file*' -print \)
./file1
./bb/file3
कारण यह है कि यह कार्य समान है: यदि आप -print
दूसरे खंड में नहीं डालते हैं , तो चूंकि कार्रवाई के अलावा कोई कार्रवाई नहीं -prune
है, -print
इसलिए कमांड के END में स्वचालित रूप से जोड़ देगा , जिससे -prune
खंड प्रिंट हो जाएगा छंटाई की गई निर्देशिका:
find . \( \( -type d -name aa -prune \) -o \( -type f -name 'file*' \) \) -print
./aa
./file1
./bb/file3
सामान्य तौर पर, आपको -print
कमांड को दूसरे क्लॉज में रखने की आवश्यकता होती है । यदि आप इसे बीच में रखते हैं जैसे कि मूल पोस्टर ने किया है, तो यह सही ढंग से काम नहीं करेगा क्योंकि छंटाई की जा रही फ़ाइलों को तुरंत प्रिंट किया जाएगा और दूसरे खंड को उन फ़ाइलों को चुनने का मौका नहीं मिलेगा जो यह चाहते हैं:
find . \( -type d -name aa -prune -o -print \) -o \( -type f -name 'file*' \)
.
./file1
./bb
./bb/file3
इसलिए दुर्भाग्य से, मूल पोस्टर को -print
गलत जगह रखकर ऊपर गलत आदेश मिला । यह उनके विशिष्ट मामले के लिए काम कर सकता है, लेकिन यह सामान्य मामले में काम नहीं करता है।
ऐसे हजारों लोग हैं जिन्हें समझने में कठिनाई होती है कि कैसे -prune
काम करता है। find
आदमी पृष्ठ इस आदेश के बारे में neverending दुनिया भर में भ्रम की स्थिति को रोकने के लिए अद्यतन किया जाना चाहिए।
-print
, अन्यथा निहित-print
पूरी स्थिति पर लागू होता है