我有一个shell命令,格式如下:
my_cmd -I file1.inp -O file1.out
在file1.inp
上完成某些处理,结果存储在file1.out
在我的主目录中,我有许多格式为*.inp
的文件,我想为所有这些文件运行此命令,并将结果存储到*.out
。我可以只使用shell脚本来实现这个目标吗?
答案 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