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
ব্যাখ্যা
জেডএস ব্যবহারকারীদের জন্য রয়েছে গ্লোব (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)
, যা আমরা একইভাবে পড়তে পারি: "ব্যর্থতা, সম্পূর্ণ ডিরেক্টরি সম্পর্কে আমাকে সতর্ক করবেন না"।