Bash:检查文件名是否存在

时间:2016-01-15 14:33:25

标签: bash if-statement filenames

我有一个简单的if语句,用于检查目录中是否存在文件。如果匹配,则返回OK,否则,它返回FAIL。

if [[  -f Foobarfile_"${TODAY}"*.txt ]]; then echo "OK"; else echo "Fail!"; fi

$TODAY是具有YYYY-MM-DD格式的日期戳。

如果我在目录Foobarfile_2016-01-15_100.txt中作为唯一文件,则if语句将返回true。

我很困惑,因为如果目录有多个文件,if语句将返回false。例如。如果它有另一个名为“Foobarfile_2016-01-15_101.txt”的文件

只要目录中的文件名具有今天的日期戳,即基本上应该检查:

Foobarfile_2016-01-15_100.txt
Foobarfile_2016-01-15_101.txt
somethingelse_2016-01-15_102.txt
KrispyKreme_2016-01-14_98.txt
Foobarfile_2016-01-15_104.txt...

它应该返回true。任何人都可以帮忙解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

如果我理解正确,您想测试一个或多个文件是否包含今天的日期。一种方法是使用数组:

shopt -s nullglob
files=( Foobarfile_"${TODAY}"*.txt )
if [[ ${#files} -ge 1 ]]; then
    echo "OK"
fi

shopt -s nullglob设置nullglob shell option。设置此选项后,如果没有文件与模式匹配,则数组将为空。否则,失败的扩展将导致该数组包含一个元素,例如Foobarfile_2016-01-15*.txt

答案 1 :(得分:0)

如果Statement的类型为[[expression]]
不会发生路径名扩展,请参阅Bash手册。

在您的情况下,表达式[[将搜索带有名称的文件 Foobarfile_2016-01-15 * .txt不存在。

那是你正在“失败”打印。

答案 2 :(得分:0)

[ -f Foobarfile_$(date --rfc-3339=date)*.txt ] && echo "OK" || echo "no joy"