如何检查 AIX 上 ksh 中的目录是否为空?
如果文件存在,我只需要删除文件。
答案1
dir
这是一种仅使用内置 shell 结构来测试是否为空的 POSIX 兼容方法。该set
命令将位置参数设置为点文件(包括始终存在的.
和..
),后跟非点文件。如果目录为空,则.*
glob 仅匹配.
和..
,并且*
glob 不匹配任何内容,因此保持未展开状态。
set dir/.* dir/*
[ "$1" = "dir/." ] && [ "$2" = "dir/.." ] && ! [ -e "$3" ] && ! [ -L "$3" ]
这适用于 ATT ksh,但对于某些省略.
和..
条目的 shell 会失败。为了更加便携,您还需要允许.*
不匹配任何内容。
set dir/.* dir/*
case $# in
0) true;; # can't happen in a standard shell, this is for shells with nullglob
2) { [ "$1" = "dir/.*" ] && [ "$2" = "dir/*" ] && ! [ -e "$1" ] && ! [ -L "$1" ] && ! [ -e "$2" ] && ! [ -L "$2" ]; } ||
{ [ "$1" = "dir/." ] && [ "$2" = "dir/.." ]; };;
3) [ "$1" = "dir/." ] && [ "$2" = "dir/.." ] && ! [ -e "$3" ] && ! [ -L "$3" ];;
*) false;;
esac
足够新的 ksh 版本允许更简单的测试,但我认为 AIX 太旧了(甚至是它的ksh93
)。以下是如何测试dir
最近的 ksh93 中是否为空:
FIGNORE='.?(.)'; set -- ~(N)dir/*; [[ $# -eq 0 ]]
或者替代地
FIGNORE=; set -- dir/*; [[ $# -eq 2 ]]
另一种方法是调用find
.这更简单,因为find
不会特殊对待点文件,并且不会像 shell 难以区分与单个文件匹配的模式和因不匹配任何内容而未展开的模式。
[ -z "$(find dir/. -name . -o -print | head -n 1)" ]
答案2
在任何外壳中[ "$(find path_to_dir -mindepth 1)" ] || echo EMPTY
答案3
我知道没有直接的方法,这也取决于您是否也想考虑点文件。这(或其变体)可能会做你想要的......
set directory/*
[[ -f $1 ]] || print empty
答案4
这是一个适用于许多 Unix 的函数,
在 Bourne 兼容的外壳上(甚至是史前模型),
并且不会钻得太深(文件系统、CPU 和大脑):
isempty() { [ -z "`find \"$1/.\" ! -name . -print -prune | head -1`" ] ; }