ZSH
Sorunun bash için işaretlendiğini biliyorum; ancak zsh kullanıcıları için sadece referans için :
Boş olmayan dizini test edin
foo
Boş olup olmadığını kontrol etmek için :
$ for i in foo(NF) ; do ... ; done
burada, foo
boş değilse , for
bloktaki kod çalıştırılacaktır.
Boş dizini test edin
foo
Boş olup olmadığını kontrol etmek için :
$ for i in foo(N/^F) ; do ... ; done
burada, foo
boşsa, for
bloktaki kod çalıştırılacaktır.
notlar
foo
Yukarıdaki dizinden alıntı yapmamıza gerek yoktu , ancak bunu yapmamız gerekirse yapabiliriz:
$ for i in 'some directory!'(NF) ; do ... ; done
Bir dizin olmasa bile birden fazla nesneyi test edebiliriz:
$ 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
Dizin olmayan her şey göz ardı edilecektir.
Ekstralar
Globling olduğumuz için herhangi bir glob (veya küme ayracı genişletmesi) kullanabiliriz:
$ 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
Bir diziye yerleştirilmiş nesneleri de inceleyebiliriz. Yukarıdaki gibi dizinlerle, örneğin:
$ 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
Böylece, bir dizi parametresinde önceden ayarlanmış olabilecek nesneleri test edebiliriz.
Bloktaki kodun for
açıkça sırayla her dizinde yürütüldüğüne dikkat edin. Bu istenmiyorsa, bir dizi parametresini doldurabilir ve ardından bu parametre üzerinde işlem yapabilirsiniz:
$ for i in *(NF) ; do full_directories+=($i) ; done
$ do_something $full_directories
açıklama
Zsh kullanıcıları için , "dolu" (boş olmayan) dizinlerle eşleşen (F)
glob niteleyicisi (bkz. man zshexpn
) Vardır :
$ 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/
Eleme (F)
listeleri bu maçı nesneleri: Bir dizinidir VE boş değil. Yani, (^F)
eşleşir: bir dizin değil VEYA boş. Böylece, örneğin (^F)
tek başına normal dosyaları da listeleyecektir. Bu nedenle, zshexp
man sayfasında açıklandığı gibi (/)
, yalnızca dizinleri listeleyen glob niteleyicisine de ihtiyacımız var :
$ 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
Böylece, belirli bir dizinin boş olup olmadığını kontrol etmek için şunu çalıştırabilirsiniz:
$ mkdir X
$ for i in X(/^F) ; do echo $i ; done ; echo "finished"
X
finished
ve sadece boş olmayan bir dizinin yakalanmayacağından emin olmak için:
$ mkdir Y
$ touch Y/.f
$ for i in Y(/^F) ; do echo $i ; done ; echo "finished"
zsh: no matches found: Y(/^F)
finished
Hata! Yana Y
boş değil, zsh için herhangi eşleşmeleri bulur (/^F)
( "boş dizinleri") ve böylece topak için eşleşme bulunduğunu belirten bir hata mesajı tükürür. Bu nedenle bu olası hata mesajlarını (N)
glob niteleyicisi ile bastırmamız gerekir :
$ mkdir Y
$ touch Y/.f
$ for i in Y(N/^F) ; do echo $i ; done ; echo "finished"
finished
Bu nedenle, boş dizinler için niteleyiciye ihtiyacımız var, bu niteleyiciyi (N/^F)
okuyabilirsiniz: "beni arızalar ve dolu olmayan dizinler hakkında uyarma".
Benzer şekilde, boş olmayan dizinler için niteleyiciye ihtiyacımız var, bu niteleyiciye (NF)
benzer şekilde okuyabiliriz: "beni hatalar, tam dizinler hakkında uyarma".