查找文件名是否包含bash脚本中的特定字符串

查找文件名是否包含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 我收到的错误是[[*

我在一个目录中有一堆输出文件,例如: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被解释为$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