在多个文件上运行shell脚本作为输入

时间:2016-11-03 13:02:24

标签: bash shell

我有一个shell命令,格式如下:

my_cmd -I file1.inp -O file1.out

file1.inp上完成某些处理,结果存储在file1.out

在我的主目录中,我有许多格式为*.inp的文件,我想为所有这些文件运行此命令,并将结果存储到*.out。我可以只使用shell脚本来实现这个目标吗?

3 个答案:

答案 0 :(得分:5)

您可以使用简单的循环:

for file in *.inp ; do
    my_cmd -I "${file}" -O "${file%%.inp}.out"
done

${file%%.inp}是所谓的parameter expansion。它将有效地从输入文件名中删除扩展名.inp

有一件事(感谢Jean-FrançoisFabre)。如果该文件夹不包含任何.inp个文件,则上述循环将在$file具有文字值*.inp的情况下运行一次。为避免这种情况,您需要设置nullglob选项:

shopt -s nullglob # set the nullglob option
for file in *.inp ; do
    my_cmd -I "${file}" -O "${file%%.inp}.out"
done
shopt -u nullglob # unset the nullglob option

答案 1 :(得分:4)

使用GNU parallel

parallel my_cmd -I {} -O {.}.out ::: *.inp

默认情况下,这将并行执行作业,每个核心一个作业。 {}是一个未更改的参数,{.}是相同的参数减去其扩展名。这些论点取自:::后面的词语。

答案 2 :(得分:-3)

ls *.inp| xargs -l1 -I % my_cmd -I % -O %.out