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

时间:2014-02-21 23:04:17

标签: bash file glob

我想查看某个文件夹中是否存在文件,如果存在,则运行某些事件,否则跳过此步骤。 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 
}

2 个答案:

答案 0 :(得分:4)

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

[ str ]检查str是否为非空。

在你的情况下,str-f,但它仍然只是检查 string "-f"是否非空,这显然不是(它是两个)字符,短划线和"f")。

[ -f $filename ]的情况尤其令人费解。当$filename为空且未加引号时,该命令将变为[ -f ]并且为真。总是引用你的变量。

答案 1 :(得分:0)

that other guy's answer解释了为什么[ -f ]不起作用。

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

[[ -f '/path/to/file' ]] # correct
[[ -f /path/to/* ]]      # WRONG

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

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