有没有办法使用文件名扩展在一个test
表达,更具体地说,一个bash 条件表达式?
例如:
[[ -f foo* ]] && echo 'found it!' || echo 'nope!';
...将输出“没有!”文件是否foobar
存在于当前目录中。
并添加一个var
喜欢...
bar=foo*
[[ -f `echo $bar` ]] && echo 'found it!' || echo 'nope!';
...将输出“找到了!”如果foobar
文件存在,但前提是echo $bar
扩展仅返回一个文件。
答案1
下面假设您不关心 glob 是否匹配任何文件,包括块特殊文件、字符特殊文件、目录、符号链接等。
这是以下的理想用例failglob
:
shopt -s failglob
if echo foo* &>/dev/null
then
# files found
else
# no files found
fi
或者,如果您需要文件列表(如果存在):
shopt -s failglob
files=(foo*)
if [[ "${#files[@]}" -eq 0 ]]
then
# no files found
else
# files found
fi
如果找不到文件是错误,您可以简化此操作:
set -o errexit
shopt -s failglob
files=(foo*)
# We know that the expansion succeeded if we reach this line
旧答案
ls
这可能是脚本中(罕见!)的合法使用:
if ls foo* &>/dev/null
then
…
else
…
fi
或者,find foo* -maxdepth 0 -printf ''
。
答案2
基于这个答案,我们可以使用它shopt -s nullglob
来确保在目录为空时返回注释:
[[ -n "$(shopt -s nullglob; echo foo*)" ]] && echo 'found it!' || echo 'nope!';
答案3
为了完整起见,这里有一些使用的示例find
:
#!/bin/bash
term=$1
if find -maxdepth 1 -type f -name "$term*" -print -quit | grep -q .; then
echo "found"
else
echo "not found"
fi
if [ -n "$(find -maxdepth 1 -type f -name "$term*" -print -quit)" ]; then
echo "found"
else
echo "not found"
fi
和一些测试:
user@host > find -type f
./foobar
./bar/foo
./bar/bar
./find_prefixed_files.sh
./ba
user@host > ./find_prefixed_files.sh foo
found
found
user@host > ./find_prefixed_files.sh bar
not found
not found