@ meuh का दृष्टिकोण अक्षम है क्योंकि उनका -maxdepth 1
दृष्टिकोण अभी भी find
1 स्तर पर निर्देशिकाओं की सामग्री को पढ़ने देता है ताकि बाद में उन्हें अनदेखा कर सकें। यह कुछ find
कार्यान्वयन (GNU सहित find
) के साथ ठीक से काम नहीं करेगा यदि कुछ निर्देशिका नामों में बाइट्स के अनुक्रम होते हैं जो उपयोगकर्ता के स्थान में मान्य वर्ण नहीं बनाते हैं (जैसे किसी भिन्न वर्ण एन्कोडिंग में फ़ाइल नाम के लिए)।
find . \( -name . -o -prune \) -extra-conditions-and-actions
GNU's -maxdepth 1
(या FreeBSD -depth -2
) को लागू करने के लिए अधिक विहित तरीका है ।
आम तौर पर हालांकि, यह -depth 1
आप चाहते हैं ( -mindepth 1 -maxdepth 1
) के रूप में आप पर विचार नहीं करना चाहते .
(गहराई 0), और फिर यह और भी सरल है:
find . ! -name . -prune -extra-conditions-and-actions
के लिए -maxdepth 2
, वह बन जाता है:
find . \( ! -path './*/*' -o -prune \) -extra-conditions-and-actions
और यह वह जगह है जहाँ आप अमान्य वर्ण समस्याओं में चलते हैं।
उदाहरण के लिए, यदि आपके पास एक निर्देशिका है, Stéphane
लेकिन वह é
iso8859-1 (उर्फ लैटिन 1) चारसेट (0xe9 बाइट) में एन्कोडेड है, जैसा कि पश्चिमी यूरोप और अमेरिका में 2000 के दशक के मध्य तक सबसे आम था, तो 0xe9 बाइट कोई नहीं है। UTF-8 में मान्य वर्ण। तो, UTF-8 स्थानों में, *
वाइल्डकार्ड (कुछ के साथ find
कार्यान्वयन) से मेल नहीं खाएगी Stéphane
के रूप में *
0 या उससे अधिक है वर्ण और 0xe9 एक चरित्र नहीं है।
$ locale charmap
UTF-8
$ find . -maxdepth 2
.
./St?phane
./St?phane/Chazelas
./Stéphane
./Stéphane/Chazelas
./John
./John/Smith
$ find . \( ! -path './*/*' -o -prune \)
.
./St?phane
./St?phane/Chazelas
./St?phane/Chazelas/age
./St?phane/Chazelas/gender
./St?phane/Chazelas/address
./Stéphane
./Stéphane/Chazelas
./John
./John/Smith
मेरा find
(जब आउटपुट एक टर्मिनल पर जाता है) उस 0xe9 बाइट को ?
ऊपर की तरह दिखाता है । आप देख सकते हैं कि डी St<0xe9>phane/Chazelas
नहीं था prune
।
आप इसके द्वारा काम कर सकते हैं:
LC_ALL=C find . \( ! -path './*/*' -o -prune \) -extra-conditions-and-actions
लेकिन ध्यान दें कि यह find
और इसके द्वारा चलाए जाने वाले किसी भी एप्लिकेशन की सभी स्थानीय सेटिंग्स को प्रभावित करता है (जैसे कि -exec
विधेय के माध्यम से )।
$ LC_ALL=C find . \( ! -path './*/*' -o -prune \)
.
./St?phane
./St?phane/Chazelas
./St??phane
./St??phane/Chazelas
./John
./John/Smith
अब, मुझे वास्तव में एक -maxdepth 2
नोट मिल गया है कि कैसे दूसरे स्टीफन में é को ठीक से UTF-8 में एनकोड किया गया है, जो ??
कि यूटीएफ -8 एन्कोडिंग के 0xc3 0xa9 बाइट्स (सी लोकेल में दो व्यक्तिगत अपरिभाषित पात्रों के रूप में) के रूप में प्रदर्शित होता है। सी लोकेल में प्रिंट करने योग्य अक्षर नहीं।
और अगर मैंने एक जोड़ -name '????????'
दिया होता, तो मुझे गलत स्टीफन मिल जाता (एक iso8859-1 में एन्कोडेड)।
के बजाय मनमाने रास्तों पर लागू करने के लिए .
, आप यह करेंगे:
find some/dir/. ! -name . -prune ...
के लिए -mindepth 1 -maxdepth 1
या:
find some/dir/. \( ! -path '*/./*/*' -o -prune \) ...
के लिए -maxdepth 2
।
मैं अभी भी एक:
(cd -P -- "$dir" && find . ...)
पहला इसलिए कि इससे रास्ते बहुत छोटे हो जाते हैं, जिसके कारण बहुत लंबा रास्ता तय करना संभव हो जाता है या बहुत लंबी समस्याएँ आ जाती हैं लेकिन इस तथ्य के इर्द-गिर्द काम करना पड़ता है कि find
वे मनमाने तरीके से तर्क का समर्थन नहीं कर सकते हैं ( -f
फ्रीबीएसडी को छोड़कर find
) क्योंकि यह चोक हो जाएगा $dir
जैसे मान !
या -print
...
-o
निषेध के साथ संयोजन में एक आम चाल के दो स्वतंत्र सेट चलाने के लिए है -condition
/ -action
में find
।
यदि आप -action1
फ़ाइल मीटिंग पर -condition1
और स्वतंत्र रूप -action2
से फ़ाइलों की मीटिंग पर चलना चाहते हैं -condition2
, तो आप ऐसा नहीं कर सकते:
find . -condition1 -action1 -condition2 -action2
जैसा -action2
कि दोनों शर्तों को पूरा करने वाली फ़ाइलों के लिए ही चलाया जाएगा ।
और न ही:
find . -contition1 -action1 -o -condition2 -action2
के रूप में दोनों शर्तों को -action2
पूरा करने वाली फ़ाइलों के लिए नहीं चलाया जाएगा ।
find . \( ! -condition1 -o -action1 \) -condition2 -action2
के रूप में काम करता है हर फ़ाइल के \( ! -condition1 -o -action1 \)
लिए सच का समाधान होगा । यह मानता -action1
है कि एक क्रिया (जैसे ) -prune
, -exec ... {} +
जो हमेशा सच होती है । जैसे कार्यों के लिए -exec ... \;
है कि वापस आ सकते हैं झूठी , आप एक और जोड़ सकते हैं -o -something
जहां -something
हानिरहित है लेकिन रिटर्न सच की तरह -true
जीएनयू में find
या -links +0
या -name '*'
(हालांकि टिप्पणी ऊपर अमान्य वर्ण के बारे में मुद्दा)।
-depth -2
,-depth 1
... दृष्टिकोण को GNU की तुलना में बेहतर देखा जा सकता है-maxdepth
/-mindepth