如何检查目录中是否存在名称为 "template" 的文件?
How can I check if exists file with name according to "template" in the directory?
给定名称为 template
的变量,例如:template=*.txt
.
如何检查当前目录中是否存在名称类似于此模板的文件?
比如根据上面template
的值,想知道当前目录下有没有后缀为.txt
的文件
使用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
)。数组的每个元素恰好是一个匹配项。
我会用内置插件来做:
templcheck () {
for f in * .*; do
[[ -f $f ]] && [[ $f = ]] && return 0
done
return 1
}
这将模板作为参数(必须引用以防止过早扩展)并且 returns 如果当前目录中有匹配项则成功。这应该适用于任何文件名,包括带有空格和换行符的文件名。
用法如下:
$ ls
file1.txt 'has space1.txt' script.bash
$ templcheck '*.txt' && echo yes
yes
$ templcheck '*.md' && echo yes || echo no
no
要与包含在变量中的模板一起使用,还必须引用该扩展:
templcheck "$template"
给定名称为 template
的变量,例如:template=*.txt
.
如何检查当前目录中是否存在名称类似于此模板的文件?
比如根据上面template
的值,想知道当前目录下有没有后缀为.txt
的文件
使用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
)。数组的每个元素恰好是一个匹配项。
我会用内置插件来做:
templcheck () {
for f in * .*; do
[[ -f $f ]] && [[ $f = ]] && return 0
done
return 1
}
这将模板作为参数(必须引用以防止过早扩展)并且 returns 如果当前目录中有匹配项则成功。这应该适用于任何文件名,包括带有空格和换行符的文件名。
用法如下:
$ ls
file1.txt 'has space1.txt' script.bash
$ templcheck '*.txt' && echo yes
yes
$ templcheck '*.md' && echo yes || echo no
no
要与包含在变量中的模板一起使用,还必须引用该扩展:
templcheck "$template"