如何在单个命令中检查目录是否为空?

时间:2015-05-13 13:49:50

标签: shell unix

我想用unix命令检查目录是否为空(需要排除。和..)?

提前感谢。

4 个答案:

答案 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函数中以使其更具可读性。

相关问题