我在workdir中有很多png文件,可以根据每个文件末尾名称中定义的类进行分组。例如,对于有3个类的情况,它应该是:
# all files for class1
a1.b1.c1__class1.png
a2.b2.c2__class1.png
..
aN.bN.cN__class1.png
# all files for class2
a1.b1.c1__class2.png
a2.b2.c2__class2.png
..
aN.bN.cN__class2.png
# all files for class3
a1.b1.c1__class3.png
a2.b2.c2__class3.png
..
aN.bN.cN__class3.png
现在我需要编写一个带有循环函数的简单bash脚本,在每次执行时都将获取所有文件,但仅针对唯一类,以便将它们传递给某个程序,例如
for /workdir/*.png; do
program *__class*.png # each step only the pngs of the unique class should be recognized!
done
一个问题:如何应用某些过滤器来指定每次唯一类文件的程序应用程序?
答案 0 :(得分:2)
从文件说明中了解
for class_id in 1 2 3; do
program *__class${class_id}.png
done
或使用引号,如果可以包含空格或其他特殊字符
for class_id in 1 2 3; do
program *"__class${class_id}.png"
done
答案 1 :(得分:1)
为了使你的代码免受“参数列表太长”错误的影响,当有大量文件时,你可以在这样的循环中使用find ... | xargs ...
:
#!/bin/bash
for class_id in {1..3}; do
find workdir -type f -name "*__class$class_id.png" -print0 | xargs -0 program
done
find -print0
生成一个空终止的匹配文件列表xargs -0
处理从管道读取的空终止字符串流这将确保正确处理其中包含空格的文件。