Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
测试文件是否存在,bash脚本_Bash_Shell - Fatal编程技术网

测试文件是否存在,bash脚本

测试文件是否存在,bash脚本,bash,shell,Bash,Shell,可能重复: 我想查看目录是否为空,因此我使用[如下: [ -f "./ini/*"] 并且返回值始终为1,即使目录不是空的。 你知道怎么了吗?这对我很有用 [ "$(ls -A /path/to/directory)" ] 在你的情况下是这样的 [ "$(ls -A ./ini/)" ] 您可以使用 [ "$(ls -A /tmp)" ] && echo "Not Empty" || echo "Empty" 注意以“.”开头的文件名,正常的全局搜索或使用ls(抖动)将

可能重复:

我想查看目录是否为空,因此我使用
[
如下:

[ -f "./ini/*"]
并且返回值始终为1,即使目录不是空的。 你知道怎么了吗?

这对我很有用

[ "$(ls -A /path/to/directory)" ]
在你的情况下是这样的

[ "$(ls -A ./ini/)" ]
您可以使用

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

注意以“.”开头的文件名,正常的全局搜索或使用
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
从列表中删除

尝试以下操作:

if find ./ini/ -maxdepth 0 -empty | read;
then
echo "Not Empty"
else
echo "Empty"
fi
$ echo "*"   #With quotes
vs

看到区别了吗?当你在字符串周围加引号时,shell不能用匹配的文件替换星号

获取所需内容的方法有很多种。最简单的方法是在不使用test命令的情况下使用
ls
命令。
if
语句获取您给出的命令的输出结果。
[…]
只是
test
命令的别名。这两个语句是等效的:

$ if test -f foo.txt

$ if [ -f foo.txt ]
基本上,如果测试为真,test命令只返回一个
0
,如果测试为假,则返回一个非零。
if
命令只执行
if
语句,如果它给出的命令返回一个
0
退出代码。我之所以这样做是为了说,让我们忘记测试,只使用t他
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
).现在,让我们使用该命令而不是test命令:

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命令(可以是单词
test
[…]


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

如果下面命令的输出是
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


无法工作,因为没有在双引号字符串中执行全局搜索。您可以测试ini目录中是否存在名为
*
的文件。好友不允许好友解析
ls
的输出。
|read
在那里做什么?这不是隐藏输出的方法。。读取是放弃输出并使表达式仅在读取某些内容时计算为true(即/some/dir/被find发现为空)如果<代码>查找< /代码>没有找到任何文件,它将返回<代码> >代码> > /DEV/NULL/<代码> BASH,以及<代码> 1 > /DEV/NULL 2 > 1代码> SH。去掉<代码>测试< /代码>这是好的。然而,一个简单的<代码> L./IN/*> DEV/NULL 2 >和1 < /代码>将更快更容易。
dotglob
;)在语义上是迂腐的,
[
是一个命令,但
if
不是。相反,
if
是shell的关键字。
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