我有一个命令将文件名作为变量,我将其作为名称模式给出,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