查找文件名是否包含bash脚本中的特定字符串
我在一个目录中有一堆输出文件,例如:a.out、b.out、c.out等等 我想搜索输出文件,如果输出文件名包含某个字符串(如“a”),那么它会将相应的输出文件“a.out”打印到屏幕上 将cd插入输出文件目录后,以下是我的代码:查找文件名是否包含bash脚本中的特定字符串,bash,Bash,我在一个目录中有一堆输出文件,例如:a.out、b.out、c.out等等 我想搜索输出文件,如果输出文件名包含某个字符串(如“a”),那么它会将相应的输出文件“a.out”打印到屏幕上 将cd插入输出文件目录后,以下是我的代码: OUT_FILE="*.out" OT=$OUT_FILE STRING="a" For file in "$OT";do if [[$file == *"$STRING"*]];then echo $file fi done 我收到的错误是[[*
OUT_FILE="*.out"
OT=$OUT_FILE
STRING="a"
For file in "$OT";do
if [[$file == *"$STRING"*]];then
echo $file
fi
done
我收到的错误是[[*.out:未找到命令。看起来$file被解释为$OT,而不是与$OT匹配的单个文件
但是,当我删除if语句并只是执行for循环来回显每个$file时,输出给了我所有以.out结尾的文件
希望您能帮我理解我做错了什么。提前谢谢。您需要在
[[
之后和]
之前留出空间:
for file in *.out;do
if [[ "$file" == *"$STRING"* ]];then
printf '%s\n' "$file"
fi
done
或者只是
for file in *"$STRING"*.out; do
printf '%s\n' "$file"
done
或
没有像
[[
(适用于任何Bourne heritage shell)这样的bashism,而且速度非常快,因为它不会生成任何实用程序:
for file in *.out; do
case $file in
(*a*) printf '%s\n' "$file";;
esac
done
如果需要,可以将(*a*)
替换为(*$STRING*)
如果您有一个理解-maxdepth 1
的查找
,则可以选择:
find . -maxdepth 1 -name \*"$STRING"\*.out
PS:您的问题有点不清楚。您发布的代码测试了文件名中的
a
(我的代码也是如此)。但您的文本建议您要在文件内容中搜索a
。是哪一个?您能澄清吗?通配符(如*.out
)不会在双引号内展开,也不会在赋值的右侧展开,因此您的文件永远不会转换为文件列表(除非echo
it没有双引号)。此外,在[[
、比较元素和]之间需要空格
。空格是shell中的关键分隔符;不要忽略它们。空格——最后的边界。我的目标是在文件名中搜索a
。很抱歉造成混淆。@katiayx那么最简单的可能是对于i in*“$STRING”*.out;执行回显“$i”;完成
,假设至少有一个匹配项。您能解释一下什么是“%s\n
?谢谢!@katiayx%s
是“字符串”的printf
格式说明符。下一个参数的值将替换输出中的%s
。下一个参数的值将替换为换行符。\n
将替换为换行符。如果printf
的参数多于格式字符串中的占位符,则格式字符串将重新使用。
find . -maxdepth 1 -name \*"$STRING"\*.out