ZSH
我知道这个问题被标记为 bash;但是,仅供参考,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
任何不是目录的东西都将被忽略。
附加功能
由于我们是 glob,我们可以使用任何 glob(或大括号扩展):
$ 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) glob 限定符(参见 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 手册页所述,我们还需要(/) glob 限定符,它只列出目录:
$ 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) 的匹配项(“为空的目录”),因此会吐出一条错误消息,指出未找到 glob 的匹配项。因此,我们需要使用(N) glob 限定符来抑制这些可能的错误消息:
$ mkdir Y
$ touch Y/.f
$ for i in Y(N/^F) ; do echo $i ; done ; echo "finished"
finished
因此,对于空目录,我们需要限定符 (N/^F),您可以将其解读为:“不要警告我失败,目录未满”。
同样,对于非空目录,我们需要限定符 (NF),我们也可以将其读作:“不要警告我失败,完整目录”。