我有一个问题
我尝试了一些像
这样的功能DIR = /路径/ TMP /
if [-d“$ DIR”];那么
和
if [-f“$ DIR”];那么
但只检查/ path / tmp此路径
我该怎么办?
答案 0 :(得分:18)
shopt -s nullglob dotglob
files=(*)
(( ${#files[*]} )) || echo directory is empty
shopt -u nullglob dotglob
这个小脚本使用路径扩展files
中找到的每个文件填充数组*
。然后它检查以查看数组的大小,如果它为0则打印'目录为空'。由于使用dotglob
。
要求解析ls
的答案通常是一个坏主意和糟糕的形式。要了解原因,请阅读Why you shouldn't parse the output of ls
答案 1 :(得分:15)
您可以使用ls -A
:
if [ "$(ls -A "$DIR" 2> /dev/null)" == "" ]; then
# The directory is empty
fi
-A
显示除.
和..
之外的所有隐藏文件和目录,因此它在空目录中为空,在任何目录中为空文件或子目录。
2> /dev/null
抛弃了ls
可能打印的任何错误消息(请注意,检查不存在的目录会产生误报,但您说您已经检查过它存在)。检查您没有读取权限的目录也会产生误报。
答案 2 :(得分:1)
[ -z "$(find "$DIR" -maxdepth 0 -empty)" ] || echo "$DIR is empty!"
find
具有谓词{{1}},用于测试目录或文件是否为空,因此只有在目录或文件为空时才会列出该目录。 -empty
测试find的输出是否为空。如果是,那么该目录包含条目,如果不是,那么它是空的。
用其他代码词:
-z
另一个非常好的:
[ -n "$(find "$DIR" -maxdepth 0 -empty)" ] && echo "$DIR is empty!"
答案 3 :(得分:0)
为什么不使用ls -v
?如果没有
if $(ls -v $DIR)
答案 4 :(得分:0)
这告诉我目录是否为空或者不是,它包含的文件数量。
directory="/path/tmp"
number_of_files=$(ls -A $directory | wc -l)
if [ "$number_of_files" == "0" ]; then
echo "directory $directory is empty"
else
echo "directory $directory contains $number_of_files files"
fi
答案 5 :(得分:0)
要仅使用shell内置函数(它应该适用于我使用过的所有shell):
if test "`echo /tmp/testdir/* /tmp/testdir/.?*`" = \
"/tmp/testdir/* /tmp/testdir/.."; then
[...]
fi
我们不检查/tmp/testdir/.*,因为它会扩展到/ tmp / testdir /。 / tmp / testdir / ..表示空文件夹。
另一种内置版本:
for i in /tmp/testdir/* /tmp/testdir/.?*; do
test -e $i || break
[...]
break
done
答案 6 :(得分:-2)
rmdir "$DIR"
如果$?
为1,则目录不为空。如果为0,则为空并且将被删除。
如果您不打算将其删除,则可以重新创建它:mkdir "$DIR"