3

可能重复:
检查目录是否包含文件

我想查看一个目录是否为空,所以我使用[如下:

[ -f "./ini/*"]

并且返回值始终为 1,即使目录不为空。有什么想法有什么问题吗?

4

5 回答 5

4

试试这个:

$ echo "*"   #With quotes

对比

$ echo *    #No quotes

看到不同?当您在字符串周围加上引号时,shell 无法将号替换为匹配的文件。

有很多方法可以得到你想要的。最简单的就是使用ls没有 test 命令的命令。该if语句采用您给它的命令的输出结果。[...]只是命令的别名test。这两个语句是等价的:

$ if test -f foo.txt

$ if [ -f foo.txt ]

基本上,测试命令所做的所有事情都是0如果测试为真则返回 a 或如果测试为假则返回非零。如果给出的命令返回退出代码,则该if命令所做的只是执行该语句。我经历这一切的原因是说让我们忘记测试并简单地使用命令。if0ls

假设您有一个文件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的退出代码不是。(在这种情况下)。现在,让我们使用它来代替 test 命令:ls02

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 命令(可以是 wordtest[..])。

希望这对你有意义。人们有时很难意识到在 BASH shell 中,if命令和命令[...]是两个独立的命令,if所做的只是运行它给出的命令,然后根据它运行的命令的退出代码执行操作。

于 2012-09-11T13:15:31.077 回答
2

当心以'.'开头的文件名,正常的通配符或使用ls颤抖)不会检测到这些有几种方法可以做到这一点,我能想到的最简单的是:

/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需要从列表 中删除.和。..

于 2012-09-11T09:23:58.407 回答
0
if find ./ini/ -maxdepth 0 -empty | read;
then
echo "Not Empty"
else
echo "Empty"
fi
于 2012-09-11T12:44:09.267 回答
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
于 2012-09-11T14:29:51.310 回答
-2

这对我有用

[ "$(ls -A /path/to/directory)" ]

在你的情况下,它会是

[ "$(ls -A ./ini/)" ]

你可以使用它来测试它

[ "$(ls -A /tmp)" ] && echo "Not Empty" || echo "Empty"
于 2012-09-11T06:06:18.653 回答