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

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

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

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

for test_file in folder/*.robot; do
    robot -b debug.log -d log/ $test_file.robot;
done

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

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

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


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

shopt -s extglob
for test_file in folder/!(config).robot; do ...

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

Parsing 'folder/!(config).robot' failed: Data source does not exist.

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

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

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

答案1

在 bash 中,标记为:

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

响应更新:

shopt -s extglob
for test_file in folder/!(config).robot; do ...

导致:

解析“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

对比(新的开始):

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

其中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

答案2

您可以使用该continue命令。

另请注意,该变量选取整个路径。

for f in folder/*.robot; do
    test "$f" = folder/config.robot && continue 
    robot -b debug.log -d log/ "$f"
done

答案3

尝试这个,

for test_file in folder/*.robot; 
do 
    [ "$test_file" != "config.robot" ] && robot -b debug.log -d log/ $test_file.robot;
done
  • robot$test_file仅当不等于时才会运行config.robot

或简单使用find

find folder/*.robot ! -name "config.robot" -exec robot -b debug.log -d log/ {} +

相关内容