2012-09-11 72 views
3

可能重复:
Checking if a directory contains files测试,如果文件存在,bash脚本

我想看看如果一个目录是空的,所以我用[如下:

[ -f "./ini/*"] 

即使目录不为空,返回值也始终为1。 任何想法有什么不对?

+2

http://stackoverflow.com/questions/91368/checking-if-a-directory-contains-files –

+1

灿没有用,因为在双引号字符串中没有执行通配符。你在ini目录下测试名为'*'的文件是否存在。 – Jens

回答

4

试试这个:

$ echo "*" #With quotes 

$ echo * #No quotes 

看到区别?当你在一个字符串周围加引号时,shell不能用glob来替换带有匹配文件的星号。

有很多方法可以得到你想要的东西。最简单的方法是使用ls命令,而不使用测试命令。 if语句取得您输入的命令的输出结果。 [...]只是test命令的别名。这两个语句是等价的:

$ if test -f foo.txt 

$ if [ -f foo.txt ] 

基本上,所有的测试命令时是返回0如果测试结果是真或非零如果测试是假的。如果给出的命令返回0退出代码,则所有if命令都执行if语句。我要完成这个的原因是让我们忘记测试,并简单地使用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

语义迂腐,'['是一个命令,但'如果'不是。相反,'if'是shell的关键字。 –

-2

这对我的作品

[ "$(ls -A /path/to/directory)" ] 
你的情况

这将是

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

您可以使用

[ "$(ls -A /tmp)" ] && echo "Not Empty" || echo "Empty" 
+3

http://mywiki.wooledge.org/ParsingLs。朋友不要让朋友分析'ls'的输出。 –

2

当心文件名开头的测试 '',正常globbing或使用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需要从列表中删除...

+1

也考虑'nullglob'和'dotglob'; – c00kiemon5ter

0
if find ./ini/ -maxdepth 0 -empty | read; 
then 
echo "Not Empty" 
else 
echo "Empty" 
fi 
+0

什么是'| |阅读'在那里做?这不是隐藏输出的方法。 – c00kiemon5ter

+0

只有当读取内容(即/ some/dir /通过查找找到空)时,read才会丢弃输出并使表达式计算为true。 – aurelihein

+0

如果'find'找不到任何文件,它将返回'1'。如果要隐藏输出,请使用'>/dev/null'作为Bash,'1>/dev/null 2>&1'作为sh。 – c00kiemon5ter

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