对所有匹配的文件名模式运行命令

对所有匹配的文件名模式运行命令

我有一个命令将文件名作为变量,我将其作为名称模式给出,file_*_123.txt

Script.sh file_*_123.txt

现在,如果有多个具有匹配模式的文件,则它仅对第一个文件执行,我希望为每个与名称模式匹配的文件执行此脚本。例如 file_1_123.txt, file_2_123.txt, file_3_123.txt

某种 for 循环。但是,由于文件的数量可以是 1 或大于 1,所以不确定如何迭代。

任何人都可以建议一个解决方案吗?

答案1

这将涉及在循环中调用脚本,或者安排脚本循环遍历其命令行参数。

第一个选项:

for filename in file_*_123.txt; do
    ./Script.sh "$filename"
done

这将为每个与模式匹配的文件调用一次脚本file_*_123.txt

第二个选项:

您可以修改脚本并将其主体包装在循环中,例如

#!/bin/sh

for filename do
    # here you do whatever you need to do with "$filename"
done

或者,

#!/bin/sh

for filename in "$@"; do
    # here you do whatever you need to do with "$filename"
done

(循环的这两种变体是等效的)

这将导致脚本循环遍历其命令行参数。然后,您将按照问题中所示运行脚本:

./Script.sh file_*_123.txt

答案2

如果你想并行执行这些匹配的文件,你可以考虑使用实用程序平行线

代码示例

funcXXXX(){
    file_path="${1}"
    /PATH/Script.sh "${file_path}"
}

# make function funcXXXX can be used by parallel
export -f funcXXXX

ls /PATH/file_*_123.txt | xargs -l | parallel -k -j 0 funcXXXX

相关内容