我想看一个目录是否为空,所以我使用[
如下:
[ -f "./ini/*"]
即使目录不为空,返回值也始终为1。 任何想法有什么不对?
答案 0 :(得分:4)
试试这个:
$ echo "*" #With quotes
VS
$ echo * #No quotes
看到区别?当你在一个字符串周围加上引号时,shell不能 glob 用相应的文件替换星号。
有很多方法可以获得你想要的东西。最简单的方法是在没有test命令的情况下使用ls
命令。 if
语句获取您提供的 命令 的输出结果。 [...]
只是test
命令的别名。这两个陈述是等价的:
$ if test -f foo.txt
$ if [ -f foo.txt ]
基本上,如果测试为真,则所有测试命令都返回0
,如果测试为假,则返回非零。所有if
命令都执行if
语句,如果它给出的命令返回0
退出代码。我要完成这一切的原因是让我们忘记测试并简单地使用ls
命令。
假设您有一个文件foo.txt
,但没有文件bar.txt
。请尝试以下方法:
$ ls foo.txt > /dev/null 2>&1
$ echo $?
0
$ ls bar.txt > /dev/null 2>&1
$ echo $?
2
> /dev/null 2>&1
用于禁止所有输出。请注意,文件存在时ls
命令的退出代码为0
,而文件不存在时ls
命令的退出代码不是0
。 (在这种情况下是2
)。现在,让我们使用它而不是测试命令:
if ls ./ini/* > /dev/null 2>&1
then
echo "There are files in that directory!"
else
echo "There are no files in that directory"
fi
注意我甚至不打扰测试命令(可以是单词test
或[..]
)。
希望这对你有意义。有时很难让人们意识到在BASH shell中,if
命令和[...]
是两个独立的命令,所有if
正在执行的是运行它给出的命令然后依赖于在它运行的命令的退出代码上。
答案 1 :(得分:2)
注意以'。'开头的文件名,正常的globbing或使用ls
( shudder )将无法检测到这些有多种方法可以做到这一点,最简单的我可以想出来是:
/home/user1> mkdir ini
/home/user1> cd ini
/home/user1/ini> touch .fred jim tom dick harry
/home/user1/ini> cd ..
/home/user1> declare -a names
/home/user1> names=(./ini/* ./ini/.*)
/home/user1> number_of_files=$(( ${#names[@]} -2 ))
/home/user1> echo $number_of_files
5
要求-2
从列表中删除.
和..
。
答案 2 :(得分:0)
if find ./ini/ -maxdepth 0 -empty | read;
then
echo "Not Empty"
else
echo "Empty"
fi
答案 3 :(得分:0)
如果以下命令的输出为0
,则目录中没有文件(目录为空),否则它有文件!
$find "/path/to/check" -type f -exec echo {} \;|wc -l
所以对你 -
exist=`find "./ini" -type f -exec echo {} \;|wc -l`
if [ $exist -gt 0 ]
then
echo "Directory has files"
else
echo "Directory is empty"
fi
或者
if [ `find "./ini" -type f -exec echo {} \;|wc -l` -gt 0 ]
then
echo "Directory has files"
else
echo "Directory is empty"
fi
答案 4 :(得分:-2)
这对我有用
[ "$(ls -A /path/to/directory)" ]
在你的情况下它将是
[ "$(ls -A ./ini/)" ]
您可以使用
进行测试[ "$(ls -A /tmp)" ] && echo "Not Empty" || echo "Empty"