我需要通过将一组文件传递给matlab或python脚本来处理目录中的一组文件。
对于目录中的每个输入文件FileName.IN,我需要获得一个输出文件FileName.OUT.。
解决方案是Python还是bash脚本并不重要。
为了实现我的目标,我尝试了GNU Make (或者),但是我有点被它卡住了。看起来我可以这样说:“嗨,对于每个输出(目标)文件,FileName.out搜索相应的FileName.IN (先决条件)”。
然而,正如前面所说,我想做的正好相反。
make (或snakemake)是正确的选择吗?我的makefile代码看起来是这样的,但它做不到(我是GNU的新手):
in_files = *.IN
out_files = *.out
$(out_files) : $(in_files)
matlab -nosplash -nodesktop -r "a_matlab_function('$<','$@')"发布于 2017-01-17 14:15:07
我对Snakemake一无所知,但在GNU中,您可以将in_files转换为out_files
in_files = $(wildcard *.IN)
out_files = $(in_files:.IN=.out)然后创建一个依赖于所有输出的虚拟目标:
all: $(out_files)
.PHONY: all最后是从一个输入创建一个输出的规则:
%.out: %.IN
matlab -nosplash -nodesktop -r "a_matlab_function('$<','$@')"发布于 2017-01-17 14:14:13
我认为您只是想要一个bash for循环:
for f in *.IN; do
out=${f%IN}OUT # Work out name of output file
echo IN:"$f" # Show input file to user
echo OUT:"$out" # Show output file to user
matlab <options> "$f" "$out" # Run Matlab
done所以,如果我有这些文件
ls *IN
aThird.IN
another one.IN
b.IN我去拿这个:
IN:aThird.IN
OUT:aThird.OUT
IN:another one.IN
OUT:another one.OUT
IN:b.IN
OUT:b.OUT或者,作为一条单线:
for f in *.IN; do out=${f%IN}OUT; matlab ... "$f" ... "$out"; doneNotes
虽然您的问题建议使用make,但没有明确的指示您是否总是期望运行所有作业,或者某些作业有时不需要运行--大概是因为输出文件已经存在,并且没有必要运行它们。如果您不希望每次都运行所有的作业,那么使用make可能会更好。
此外,如果Matlab可以运行并行实例,那么GNU并行语法很适合如下所示:
parallel --dry-run matlab {} {.}.OUT ::: *IN输出
matlab another\ one.IN another\ one.OUT
matlab aThird.IN aThird.OUT
matlab b.IN b.OUT 在这里,--dry-run将显示将要运行的命令,尽管它目前没有运行任何命令。
https://stackoverflow.com/questions/41698983
复制相似问题