Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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_File_Glob - Fatal编程技术网

即使文件夹为空,也会使用bash找到文件-测试目录是否为空

即使文件夹为空,也会使用bash找到文件-测试目录是否为空,bash,file,glob,Bash,File,Glob,我想查看文件是否存在于某个文件夹中,如果存在,请运行某个事件,否则跳过此操作。Bash查看我的空文件夹中的文件 我尝试了几种不同的方法,所有这些方法都显示文件存在 $ [ -f ] && echo "Found" || echo "Not found" Found $ [ -r ] && echo "Found" || echo "Not found" Found $ [ -e ] && echo "Found" || echo "Not foun

我想查看文件是否存在于某个文件夹中,如果存在,请运行某个事件,否则跳过此操作。Bash查看我的空文件夹中的文件

我尝试了几种不同的方法,所有这些方法都显示文件存在

$ [ -f ] && echo "Found" || echo "Not found"
Found
$ [ -r ] && echo "Found" || echo "Not found"
Found
$ [ -e ] && echo "Found" || echo "Not found"
Found
鉴于它没有:

$ ls -lrt
total 0
我错过了什么

我的实际代码是:

get_last_parsed_file_time ()
{
if [ -s "$DATA_DIR$EPG_XML_FILES" ]
then
    NEWEST_FILE=$( ls -tr | tail -1 )
    LAST_PARSED_TIME=$( stat -c %Y $NEWEST_FILE )
else
    NO_FILE=1
fi 
}

[-f filename]
检查
filename
是否是存在的文件

[str]
检查
str
是否为非空

在您的例子中,
str
-f
,但它仍然只是检查字符串
“-f”
是否为非空,而它显然不是空的(它是两个字符,一个破折号和一个
“f”


这在
[-f$filename]
的情况下尤其令人费解。当
$filename
为空且不带引号时,该命令将变为
[-f]
,且为真。始终引用变量。

[-f filename]
检查
文件名是否存在

[str]
检查
str
是否为非空

在您的例子中,
str
-f
,但它仍然只是检查字符串
“-f”
是否为非空,而它显然不是空的(它是两个字符,一个破折号和一个
“f”

这在
[-f$filename]
的情况下尤其令人费解。当
$filename
为空且不带引号时,该命令将变为
[-f]
,且为真。始终引用变量。

解释了为什么
[-f]
不起作用

更一般地说,重要的是要注意,不能将globs(文件名模式,如
*
传递给bash文件测试操作符,如
-f
文件测试操作符期望一个单一的文本文件名或文件路径(作为字符串文本或存储在变量中的字符串)

下面是一个测试文件夹是否为空的片段,即它是否包含任何项目,无论是文件、隐藏文件还是子文件夹:

folder='/path/to/folder'
[[ -n $(ls -A "$folder" | head -n 1) ]] && echo "NON-empty" || echo "EMPTY"
    只考虑非隐藏项,从<代码> ls 命令中删除<代码> ->代码>
  • 要安静地忽略输入文件夹不存在或不可访问的情况,请将
    2>/dev/null
    附加到
    ls
    命令
    • 解释了为什么
      [-f]
      不起作用

      更一般地说,重要的是要注意,不能将globs(文件名模式,如
      *
      传递给bash文件测试操作符,如
      -f
      文件测试操作符期望一个单一的文本文件名或文件路径(作为字符串文本或存储在变量中的字符串)

      下面是一个测试文件夹是否为空的片段,即它是否包含任何项目,无论是文件、隐藏文件还是子文件夹:

      folder='/path/to/folder'
      [[ -n $(ls -A "$folder" | head -n 1) ]] && echo "NON-empty" || echo "EMPTY"
      
        只考虑非隐藏项,从<代码> ls 命令中删除<代码> ->代码>
      • 要安静地忽略输入文件夹不存在或不可访问的情况,请将
        2>/dev/null
        附加到
        ls
        命令

      或者,使用(在bash中)首选形式
      […]]
      ,然后引用变量引用是可选的。无论如何,在大多数情况下。如果
      x='[wtf],则未引用,
      [[[[$x==$x]]]
      为false“
      谢谢-不知道这一点;是什么解释了这种意外行为?我理解-f,其他人也是这样吗?比如r/s/e?@mklement0==匹配一个模式,而不是一个字符串。当引用右侧时,它被认为是一个文本而不是一个全局。或者,使用(在bash中)首选形式
      […]
      ,则引用变量引用是可选的。无论如何,在大多数情况下,
      [[[$x==$x]]]
      如果
      x='[wtf],则为false“
      Thank-我不知道;是什么解释了这种意外行为?我理解-f,其他人也是这样吗?比如r/s/e?@mklement0==匹配一个模式,而不是一个字符串。当引用右侧时,它被认为是一个文本而不是一个全局。谢谢。我必须检查大部分内容,因为我不熟悉它。@utamav:我修改了我的答案,希望对你更有帮助。谢谢。我必须检查大部分内容,因为我对它不熟悉。@utamav:我的答案被大幅修改,希望对你更有帮助。