使用匹配的文件在循环中调用程序

时间:2018-03-13 16:35:17

标签: bash loops

我在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

一个问题:如何应用某些过滤器来指定每次唯一类文件的程序应用程序?

2 个答案:

答案 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处理从管道读取的空终止字符串流

这将确保正确处理其中包含空格的文件。