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

kat*_*ayx 10 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
Run Code Online (Sandbox Code Playgroud)

我收到的错误是 [[*.out: command not found。看起来 $file 被解释为 $OT,而不是与 $OT 匹配的单个文件。

但是当我删除 if 语句并只执行 for 循环来回显每个 $file 时,输出给了我所有以 .out 结尾的文件。

希望得到一些帮助以了解我做错了什么。提前致谢。

Kus*_*nda 10

[[前后需要空间]]

for file in *.out;do
  if [[ "$file" == *"$STRING"* ]];then
    printf '%s\n' "$file"
  fi
done
Run Code Online (Sandbox Code Playgroud)

要不就

for file in *"$STRING"*.out; do
    printf '%s\n' "$file"
done
Run Code Online (Sandbox Code Playgroud)

或者

printf '%s\n' *"$STRING"*.out
Run Code Online (Sandbox Code Playgroud)


Jen*_*ens 5

没有像[[(适用于任何 Bourne-heritage shell)之类的 bashisms并且非常快,因为它没有分叉任何实用程序:

for file in *.out; do
  case $file in
    (*a*) printf '%s\n' "$file";;
  esac
done
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以(*a*)(*$STRING*).

如果你有一个find理解的替代方案-maxdepth 1

find . -maxdepth 1 -name \*"$STRING"\*.out
Run Code Online (Sandbox Code Playgroud)

PS:你的问题有点不清楚。您a文件名中发布测试的代码(我的代码也是如此)。但是您的文字表明您要a文件内容中搜索。是哪个?你能澄清一下吗?