ZSH
मुझे पता है कि सवाल बैश के लिए चिह्नित किया गया था; लेकिन, सिर्फ संदर्भ के लिए, zsh उपयोगकर्ताओं के लिए:
गैर-खाली निर्देशिका के लिए परीक्षण
यह जाँचने के लिए कि foo
क्या गैर-रिक्त है:
$ for i in foo(NF) ; do ... ; done
जहां, यदि foo
गैर-रिक्त है, तो for
ब्लॉक में कोड निष्पादित किया जाएगा।
खाली निर्देशिका के लिए परीक्षण करें
यह जाँचने के लिए कि foo
क्या खाली है:
$ for i in foo(N/^F) ; do ... ; done
जहां, यदि foo
खाली है, तो for
ब्लॉक में कोड निष्पादित किया जाएगा।
टिप्पणियाँ
हमें foo
ऊपर दी गई निर्देशिका को उद्धृत करने की आवश्यकता नहीं थी , लेकिन हम ऐसा कर सकते हैं:
$ for i in 'some directory!'(NF) ; do ... ; done
हम एक से अधिक ऑब्जेक्ट का परीक्षण भी कर सकते हैं, भले ही वह निर्देशिका न हो:
$ mkdir X # empty directory
$ touch f # regular file
$ for i in X(N/^F) f(N/^F) ; do echo $i ; done # echo empty directories
X
जो कुछ भी एक निर्देशिका नहीं है उसे सिर्फ अनदेखा किया जाएगा।
अतिरिक्त
चूंकि हम ग्लोबिंग कर रहे हैं, हम किसी भी ग्लोब (या ब्रेस विस्तार) का उपयोग कर सकते हैं:
$ mkdir X X1 X2 Y Y1 Y2 Z
$ touch Xf # create regular file
$ touch X1/f # directory X1 is not empty
$ touch Y1/.f # directory Y1 is not empty
$ ls -F # list all objects
X/ X1/ X2/ Xf Y/ Y1/ Y2/ Z/
$ for i in {X,Y}*(N/^F); do printf "$i "; done; echo # print empty directories
X X2 Y Y2
हम उन वस्तुओं की भी जांच कर सकते हैं जिन्हें एक सरणी में रखा गया है। उदाहरण के लिए ऊपर दी गई निर्देशिकाओं के साथ:
$ ls -F # list all objects
X/ X1/ X2/ Xf Y/ Y1/ Y2/ Z/
$ arr=(*) # place objects into array "arr"
$ for i in ${^arr}(N/^F); do printf "$i "; done; echo
X X2 Y Y2 Z
इस प्रकार, हम उन वस्तुओं का परीक्षण कर सकते हैं जो पहले से ही एक सरणी पैरामीटर में सेट हो सकते हैं।
ध्यान दें कि for
ब्लॉक में कोड , जाहिर है, बदले में प्रत्येक निर्देशिका पर निष्पादित होता है। यदि यह वांछनीय नहीं है, तो आप बस एक सरणी पैरामीटर को आबाद कर सकते हैं और फिर उस पैरामीटर पर काम कर सकते हैं:
$ for i in *(NF) ; do full_directories+=($i) ; done
$ do_something $full_directories
व्याख्या
Zsh उपयोगकर्ताओं के लिए (F)
ग्लोब क्वालिफायर (देखें man zshexpn
) है, जो "पूर्ण" (गैर-रिक्त) निर्देशिकाओं से मेल खाता है:
$ mkdir X Y
$ touch Y/.f # Y is now not empty
$ touch f # create a regular file
$ ls -dF * # list everything in the current directory
f X/ Y/
$ ls -dF *(F) # will list only "full" directories
Y/
क्वालीफायर (F)
उन वस्तुओं को सूचीबद्ध करता है जो मेल खाते हैं: एक निर्देशिका है और खाली नहीं है। तो, (^F)
मेल खाता है: निर्देशिका नहीं या खाली है। इस प्रकार, (^F)
अकेले भी नियमित फ़ाइलों को सूचीबद्ध करेगा, उदाहरण के लिए। इस प्रकार, जैसा कि zshexp
मैन पेज पर समझाया गया है , हमें (/)
ग्लोब क्वालिफायर की भी आवश्यकता है , जो केवल निर्देशिकाओं को सूचीबद्ध करता है:
$ mkdir X Y Z
$ touch X/f Y/.f # directories X and Y now not empty
$ for i in *(/^F) ; do echo $i ; done
Z
इस प्रकार, यह जांचने के लिए कि क्या दी गई निर्देशिका खाली है, इसलिए आप चला सकते हैं:
$ mkdir X
$ for i in X(/^F) ; do echo $i ; done ; echo "finished"
X
finished
और सिर्फ यह सुनिश्चित करने के लिए कि एक गैर-खाली निर्देशिका कैप्चर नहीं की जाएगी:
$ mkdir Y
$ touch Y/.f
$ for i in Y(/^F) ; do echo $i ; done ; echo "finished"
zsh: no matches found: Y(/^F)
finished
ऊप्स! चूंकि Y
खाली नहीं है, zsh को (/^F)
("निर्देशिका जो खाली हैं") के लिए कोई मेल नहीं मिलता है और इस प्रकार एक त्रुटि संदेश देता है जिसमें कहा गया है कि ग्लोब के लिए कोई मैच नहीं मिला। इसलिए हमें (N)
ग्लोब क्वालिफायर के साथ इन संभावित त्रुटि संदेशों को दबाने की आवश्यकता है :
$ mkdir Y
$ touch Y/.f
$ for i in Y(N/^F) ; do echo $i ; done ; echo "finished"
finished
इस प्रकार, खाली निर्देशिकाओं के लिए हमें क्वालीफायर की आवश्यकता होती है (N/^F)
, जिसे आप निम्नानुसार पढ़ सकते हैं: "मुझे विफलताओं के बारे में चेतावनी न दें, निर्देशिकाएं पूर्ण नहीं हैं"।
इसी तरह, गैर-खाली निर्देशिकाओं के लिए हमें क्वालीफायर की आवश्यकता होती है (NF)
, जिसे हम इसी तरह पढ़ सकते हैं: "मुझे असफलताओं के बारे में चेतावनी न दें, पूर्ण निर्देशिकाएं"।