如何检查目录中是否存在根据“模板”命名的文件?

时间:2018-07-10 15:04:37

标签: bash variable-expansion

给出名称为template的变量,例如:template=*.txt
如何检查当前目录中是否存在名称类似此模板的文件?

例如,根据上面template的值,我想知道当前目录中是否存在带有后缀.txt的文件。

2 个答案:

答案 0 :(得分:4)

我会使用内置的插件来做到这一点:

templcheck () {
    for f in * .*; do
        [[ -f $f ]] && [[ $f = $1 ]] && return 0
    done
    return 1
}

这将模板作为参数(必须加引号,以防止过早扩展),如果当前目录中存在匹配项,则返回成功。这应该适用于任何文件名,包括带有空格和换行符的文件名。

用法如下:

$ ls
 file1.txt  'has space1.txt'   script.bash
$ templcheck '*.txt' && echo yes
yes
$ templcheck '*.md' && echo yes || echo no
no

要与变量中包含的模板一起使用,该扩展名也必须加引号:

templcheck "$template"

答案 1 :(得分:2)

使用find

: > found.txt  # Ensure the file is empty
find . -prune -exec find -name "$template" \; > found.txt
if [ -s found.txt ]; then
  echo "No matching files"
else
  echo "Matching files found"
fi

严格来说,不能假设found.txt每行仅包含一个文件名;带有嵌入式换行符的文件名看起来与两个单独的文件相同。但这确实可以确保空文件意味着没有匹配的文件。

如果要准确列出匹配的文件名,则需要在保持路径名扩展的同时禁用字段拆分。

[[ -v IFS ]] && OLD_IFS=$IFS
IFS=
shopt -s nullglob
files=( $template )
[[ -v OLD_IFS ]] && IFS=$OLD_IFS
printf "Found: %s\n" "${files[@]}"

这需要几个bash扩展名(nullglob选项,数组和-v运算符,以便于还原IFS)。数组的每个元素都完全匹配一个。