我想用unix命令检查目录是否为空(需要排除。和..)?
提前感谢。
答案 0 :(得分:3)
试试这个,很简单
[ "$(ls -A .)" ] && echo "Not Empty" || echo "Empty"
在http://www.cyberciti.biz/faq/linux-unix-shell-check-if-directory-empty/
上找到它答案 1 :(得分:2)
我会使用以下内容:
if [ `ls -A directory_to_test/ | wc -m` == "0" ]; then
echo "empty"
else
echo "not empty"
fi
ls -A
将输出目录中的文件,-A
确保排除.
和..
。 wc -m
将计算输出中的字符数,如果它等于字符串0
,则该目录为空。这也将计算"隐形"文件。
答案 2 :(得分:0)
参见"确定目录是否为空" this site的部分:
is_empty () ( cd "$1" set -- .[!.]* ; test -f "$1" && return 1 set -- ..?* ; test -f "$1" && return 1 set -- * ; test -f "$1" && return 1 return 0 )
此代码使用魔术3 globs来匹配除“。”和“..”之外的所有可能名称,并且还处理glob匹配与glob字符串相同的文字名称的情况。
如果您不关心保留权限,则更简单的实现是:
is_empty () { rmdir "$1" && mkdir "$1" ; }
当然,如果目录可由其他用户写入,或者其他进程可能正在修改它,则这两种方法都具有竞争条件。因此,像后者一样但具有适当限制性umask的方法实际上可能是优选的,因为其结果具有正确的原子性属性:
is_empty_2 () ( umask 077 ; rmdir "$1" && mkdir "$1" )
另请参阅this问题的答案。
答案 3 :(得分:0)
OP要求单线,所以这是一个使用find而不实际列出任何额外内容的东西:
if [ -d some/dir -a -n "$( find some/dir -prune -empty 2>/dev/null )" ] ; then echo empty ; fi
甚至
[ -d some/dir -a -n "$( find some/dir -prune -empty 2>/dev/null )" ] && echo empty
查找将产生“ some / dir”或“”,并且不会下降到目录的条目中,因为-prune与--maxdepth = 0具有相同的功能,但字符较少。
如果您放宽了对单行代码的要求,我会将其放在Bash函数中以使其更具可读性。