如何在Bash脚本中向可执行程序传递迭代命名的批量文件?
解决Shell循环批量处理H5文件的问题
我来帮你搞定这个循环的问题~你现在的需求是批量处理Dataset文件夹里的所有.h5输入文件,通过可执行程序生成对应输出,但写的循环里有几个明显的问题,咱们一步步修正:
问题拆解
- 多余的内层循环:你嵌套了一个
for ((n=1; n<=10, n++))循环,但外层的for input_data_ in Dataset/*.h5已经会逐个遍历所有输入文件了,内层循环会让每个文件被重复处理10次,这显然不是你想要的。 - 语法错误:就算真的需要这个内层循环,你把循环条件里的分号写成了逗号(
n<=10, n++),这才触发了arithmetic expression required的错误——C风格for循环的三个部分必须用分号分隔,正确写法是for ((n=1; n<=10; n++))。 - 后缀替换错误:你用
basename "$input_data_" .h截取文件名,但输入文件后缀是.h5,这样会导致输出文件名变成input_data_1.h_out.h5,明显不符合预期。
修正后的代码
直接去掉多余的内层循环,修正后缀替换逻辑,最终的脚本应该是这样的:
# 先确保output文件夹存在,避免输出时报错 mkdir -p output # 遍历Dataset目录下所有.h5文件,逐个处理 for input_data_ in Dataset/*.h5; do ./myexecutable -i "$input_data_" -o "output/$(basename "$input_data_" .h5)_out.h5" done
代码说明
mkdir -p output:如果output文件夹不存在就自动创建,-p参数可以避免文件夹已存在时的报错。for input_data_ in Dataset/*.h5:逐个取出Dataset目录下所有.h5文件的完整路径。$(basename "$input_data_" .h5):截取输入文件的纯文件名(去掉路径和.h5后缀),比如Dataset/input_data_1.h5会被处理成input_data_1。- 最终输出文件名会是
output/input_data_1_out.h5,完全匹配你的命名需求。
内容的提问来源于stack exchange,提问作者Farnaz
相关产品推荐
相关产品推荐

