Bash检查文件存在与文件扩展

时间:2014-09-05 17:50:40

标签: bash

我想检查目标目录中是否存在与给定模式匹配的文件,因此写入

data_dir="/home"
sample="HT001"
r1Pattern=".R1.gz"
shopt -s nullglob

if [ -f ${data_dir}/${sample}*combined${r1Pattern} ]
then
  ./myscript
fi

没有/home/HT001_combined.R1.gz存在。但是这段代码一直告诉我文件存在。我错过了什么吗?

感谢。

1 个答案:

答案 0 :(得分:4)

这是因为nullglob模式。由于该文件不存在,因此glob扩展为空。而且,对于一个空洞的争论,如果您使用-f[将返回true:

$ empty=
$ [ -f $empty ] && echo yes
yes

您可以使用bash [[来解决您的问题:

$ [[ -f $empty ]] && echo yes

[[通常提供更可预测和友好的行为。

编辑:

是的,你是对的,似乎实际上在使用[[时不评估glob。想到这一点的方式更像是:

f=(${data_dir}/${sample}*combined${r1Pattern})
if (( ${#f[@]} == 1 )) && [[ -f ${f[0]} ]]
then
    # ...
fi

这会将glob扩展为一个数组,确保只有一个结果,并验证它是一个常规文件。