可能重复:
Checking if a directory contains files测试,如果文件存在,bash脚本
我想看看如果一个目录是空的,所以我用[
如下:
[ -f "./ini/*"]
即使目录不为空,返回值也始终为1。 任何想法有什么不对?
可能重复:
Checking if a directory contains files测试,如果文件存在,bash脚本
我想看看如果一个目录是空的,所以我用[
如下:
[ -f "./ini/*"]
即使目录不为空,返回值也始终为1。 任何想法有什么不对?
试试这个:
$ 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
正在执行的命令都是运行它给出的命令,然后根据它运行的命令的退出代码进行操作。
语义迂腐,'['是一个命令,但'如果'不是。相反,'if'是shell的关键字。 –
这对我的作品
[ "$(ls -A /path/to/directory)" ]
你的情况
这将是
[ "$(ls -A ./ini/)" ]
您可以使用
[ "$(ls -A /tmp)" ] && echo "Not Empty" || echo "Empty"
http://mywiki.wooledge.org/ParsingLs。朋友不要让朋友分析'ls'的输出。 –
当心文件名开头的测试 '',正常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
需要从列表中删除.
和..
。
也考虑'nullglob'和'dotglob'; – c00kiemon5ter
if find ./ini/ -maxdepth 0 -empty | read;
then
echo "Not Empty"
else
echo "Empty"
fi
什么是'| |阅读'在那里做?这不是隐藏输出的方法。 – c00kiemon5ter
只有当读取内容(即/ some/dir /通过查找找到空)时,read才会丢弃输出并使表达式计算为true。 – aurelihein
如果'find'找不到任何文件,它将返回'1'。如果要隐藏输出,请使用'>/dev/null'作为Bash,'1>/dev/null 2>&1'作为sh。 – c00kiemon5ter
如果以下命令的输出是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
http://stackoverflow.com/questions/91368/checking-if-a-directory-contains-files –
灿没有用,因为在双引号字符串中没有执行通配符。你在ini目录下测试名为'*'的文件是否存在。 – Jens