Bash for 循环处理文件夹中除一个文件外的所有文件

ava*_*ula 3 bash shell-script for

我有一个包含 9 个 Robot Framework 测试文件的文件夹。只需执行其中的 8 个,因为最后一个用于设置所有其他的(我们称之为config.robot)。

如果我必须运行所有这些测试,我会做类似的事情

for test_file in folder/*.robot; do
    robot -b debug.log -d log/ $test_file.robot;
done
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,这意味着它config.robot也将运行,这是我不想要的。

如何对文件夹中除一个文件之外的所有文件执行 for 循环?

如果这有帮助,除了config.robot遵循以下命名语法之外的所有文件:它们都以执行顺序开头,后跟其实际名称,例如01__init-connection.robot.


编辑:在发布该问题之前,我已经看到并尝试了从全局匹配中排除一种模式中提供的答案,并写了类似的内容

shopt -s extglob
for test_file in folder/!(config).robot; do ...
Run Code Online (Sandbox Code Playgroud)

但 Robot Framework 无法识别该文件名:

Parsing 'folder/!(config).robot' failed: Data source does not exist.
Run Code Online (Sandbox Code Playgroud)

所以我猜机器人框架不喜欢这种语法。
我正在考虑根据与我的文件名结构匹配的正则表达式使用查找结果设置一个变量,然后对该变量执行 for 循环:

SUITES=$(find . -regex '^[0-9][0-9][a-zA-Z_-]*')
for SUITE in $SUITES; do robot -b ...
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,当我echo套房时,它什么也没返回。我不知道我在这里错过了什么。

Jef*_*ler 5

在 bash 中,标记为:

shopt -s extglob
for test_file in folder/!(config).robot; do robot -b debug.log -d log/ "$test_file".robot; done
Run Code Online (Sandbox Code Playgroud)

响应更新:

shopt -s extglob
for test_file in folder/!(config).robot; do ...
Run Code Online (Sandbox Code Playgroud)

导致:

解析“folder/!(config).robot”失败:数据源不存在。

如果“文件夹”中除了“config.robot”之外没有“.robot”文件,则可能会发生这种情况。考虑:

$ mkdir folder
$ touch folder/config.robot
$ shopt -s extglob
$ shopt -u nullglob
$ for f in folder/!(config).robot; do ls --- "$f"; done
ls: cannot access folder/!(config).robot: No such file or directory
Run Code Online (Sandbox Code Playgroud)

对比(新的开始):

$ mkdir folder
$ touch folder/config.robot
$ shopt -s extglob
$ shopt -s nullglob
$ for f in folder/!(config).robot; do ls -- "$f"; done
$
Run Code Online (Sandbox Code Playgroud)

其中for循环不执行任何命令,因为通配符未扩展到任何文件。

或者另一种选择,那里有config.robot 文件:

$ mkdir folder
$ touch folder/config.robot
$ touch folder/01__init-connection.robot
$ shopt -s extglob
$ shopt -s nullglob
$ for f in folder/!(config).robot; do ls -- "$f"; done
folder/01__init-connection.robot
Run Code Online (Sandbox Code Playgroud)