ZSH
Saya tahu pertanyaan itu ditandai untuk pesta; tapi, hanya untuk referensi, untuk pengguna zsh :
Uji direktori yang tidak kosong
Untuk memeriksa apakah footidak kosong:
$ for i in foo(NF) ; do ... ; done
dimana, jika footidak kosong, kode di forblok tersebut akan dieksekusi.
Uji direktori kosong
Untuk memeriksa apakah fookosong:
$ for i in foo(N/^F) ; do ... ; done
dimana, jika fookosong, kode di forblok tersebut akan dieksekusi.
Catatan
Kami tidak perlu mengutip direktori di fooatas, tetapi kami dapat melakukannya jika kami perlu:
$ for i in 'some directory!'(NF) ; do ... ; done
Kami juga dapat menguji lebih dari satu objek, meskipun itu bukan direktori:
$ 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
Apa pun yang bukan direktori akan diabaikan begitu saja.
Ekstra
Karena kita melakukan globbing, kita dapat menggunakan glob (atau ekspansi brace) apa pun:
$ 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
Kami juga dapat memeriksa objek yang ditempatkan dalam sebuah array. Dengan direktori seperti di atas, misalnya:
$ 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
Jadi, kita bisa menguji objek yang mungkin sudah disetel dalam parameter array.
Perhatikan bahwa kode di forblok tersebut, jelas, dijalankan pada setiap direktori secara bergantian. Jika ini tidak diinginkan maka Anda cukup mengisi parameter array dan kemudian mengoperasikan parameter itu:
$ for i in *(NF) ; do full_directories+=($i) ; done
$ do_something $full_directories
Penjelasan
Untuk pengguna zsh ada (F)pengualifikasi glob (lihat man zshexpn), yang cocok dengan direktori "full" (tidak kosong):
$ 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/
Qualifier (F)mencantumkan objek yang cocok: adalah direktori DAN tidak kosong. Jadi, (^F)kecocokan: bukan direktori ATAU kosong. Jadi, (^F)sendiri juga akan mencantumkan file biasa, misalnya. Jadi, seperti yang dijelaskan di zshexphalaman manual, kita juga membutuhkan (/)pengualifikasi glob, yang hanya mencantumkan direktori:
$ 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
Jadi, untuk memeriksa apakah direktori tertentu kosong, Anda dapat menjalankan:
$ mkdir X
$ for i in X(/^F) ; do echo $i ; done ; echo "finished"
X
finished
dan hanya untuk memastikan bahwa direktori yang tidak kosong tidak akan ditangkap:
$ mkdir Y
$ touch Y/.f
$ for i in Y(/^F) ; do echo $i ; done ; echo "finished"
zsh: no matches found: Y(/^F)
finished
Ups! Karena Ytidak kosong, zsh tidak menemukan kecocokan untuk (/^F)("direktori yang kosong") dan dengan demikian mengeluarkan pesan kesalahan yang mengatakan bahwa tidak ada kecocokan untuk glob yang ditemukan. Oleh karena itu, kami perlu menyembunyikan kemungkinan pesan kesalahan ini dengan(N) pengualifikasi glob:
$ mkdir Y
$ touch Y/.f
$ for i in Y(N/^F) ; do echo $i ; done ; echo "finished"
finished
Jadi, untuk direktori kosong kita membutuhkan qualifier (N/^F), yang bisa dibaca sebagai: "jangan peringatkan saya tentang kegagalan, direktori yang tidak penuh".
Demikian pula, untuk direktori yang tidak kosong kita memerlukan qualifier (NF), yang juga bisa kita baca sebagai: "jangan peringatkan saya tentang kegagalan, direktori lengkap".