DIR=/u01/app/tomcat/apache-tomcat-9.0.43/work
if [ $(ls -A $DIR) ]
then
echo 'Folder is not empty'
else
echo 'Folder is empty'
fi
工作正常,输出为
文件夹不为空。
但是,如果我尝试 /temp 它会失败。抛出错误
DIR=/u01/app/tomcat/apache-tomcat-9.0.43/temp
if [ $(ls -A $DIR) ]
then
echo 'Folder is not empty'
else
echo 'Folder is empty'
fi
[:参数太多文件夹为空
为什么 /temp 不起作用。?仅当文件夹不为空时才会出现 [: Too much argumentFolder isempty 错误
答案1
关于不解析的评论ls
是正确的。然而,在这个狭窄的例子中,您遇到的问题与引用有关。
这应该有效:
if [ "$(ls -A $DIR)" ]
then
echo 'Folder is not empty'
else
echo 'Folder is empty'
fi
但出于多种原因,这确实是解决问题的一个糟糕方法。
这是一个替代方案(肯定存在大量其他方案):
if find "${DIR}/" -maxdepth 1 -mindepth 1 | head -1 | grep -Eq "^.|^$"
then
echo 'Folder is not empty'
else
echo 'Folder is empty'
fi
这里的理论是,head -1
一旦我们发现单个条目,管道就会停止,如果目录有很多条目,这应该可以节省一些时间。
刚刚grep -q "^.|^$"
证实某物(或空行)由前面的命令返回。
或者...
另一种方法是查看目录具有的“链接”数量。任何空目录都恰好有 2;特别节目.
和..
参赛作品各一份。
GNUstat
if stat --printf %h "${DIR}/" | grep -qvFx 2
then
echo 'Folder is not empty'
else
echo 'Folder is empty'
fi
MacOS 原生stat
if stat -f %l "${DIR}/" | grep -qvFx 2
then
echo 'Folder is not empty'
else
echo 'Folder is empty'
fi
这两者都假设操作系统或文件系统将阻止目录硬链接并在空时报告两个链接,如果其中一个或多个不是这种情况,则解决方案find
将是更好的选择。