在我的工作流程中,我在文件夹中有很多xxx.smr
个文件,我需要通过从xxx_step3.mat
导入一些数据将它们转换为其他文件格式xxx_info.xlsx
。我了解到GNU make在保持所有文件最新方面非常强大。
在一个非常简单的"显式"格式(没有复杂的通配符使用),此进程的Makefile将如下所示。要处理多个xxx.smr
文件及其后代,我应该可以通过修改此文件来实现。
.PHONY: all clean
all: xxx_step3.mat
xxx_step3.mat: xxx_step2.mat xxx_info.xlsx
matlab -r "merge2files('xxx_step2.mat', 'xxx_info.xlsx')"
xxx_step2.mat: xxx_step1.mat
matlab -r "convertmat('xxx_step1.mat')"
xxx_info.xlsx: master.xslx
matlab -r "extractfromMasterxlsx('master.xlsx', 'xxx_info.xlsx')"
xxx_step1.mat: xxx_step0.smr
@echo "\nCreate " $@
# I can't do this step from the command line so I leave message
clean:
rm -f xxx_step1.mat xxx_step2.mat xxx_step3.mat xxx_info.xlsx
然而,我意识到,当某些xxx.smr
文件被发现有余并且在某些时候被删除时,使用此Makefile运行GNU make不会删除过时的后代文件,包括所有中间文件和最终xxx_step3.mat
个文件,取决于那些已删除的xxx.smr
个文件。
例如,我从三个xxx.smr
文件开始并运行Make。
A.smr, B.smr, C.smr
它将创建所有后代,包括最终目标文件:
A_step3.mat, B_step3.mat, C_step3.mat
稍后,说,我发现B.smr
包含致命错误,并决定从文件夹中删除。
A.smr, C.smr
在此阶段运行Make将导致......无变化,因为A_step3.mat
和C_step3.mat
都比其直接先决条件更新(而不是A.smr
和C.smr
)。但是,实际上我需要删除B.smr
的所有后代,例如B_step1.mat
,B_step2.mat
,B_step3.mat
和B_info.xlsx
。如果保留了这些过时的文件,最终目标B_step3.mat
将包含在后续分析中并影响结果。
我想知道是否有一个" smart"删除相应的xxx_step1.mat
文件时删除xxx_step2.mat
,xxx_step3.mat
,xxx_info.xlsx
,xxx.smr
文件的方法。
或者我应该用MATLAB或Python等实现这个?
答案 0 :(得分:1)
由于Makefile
是shell命令的集合,因此您可以在clean:
目标上使用{{1}收集和删除与xxx.smr
文件对应的所有文件} loop和参数扩展/子串匹配。要查找与每个for
文件对应的所有文件,请查找所有xxx.smr
个文件。然后,对于每个xxx.smr
,提取xxx.smr
并删除所有xxx
和xxx_step?.*
文件。删除每个xxx_info.*
和step?
文件后,删除info
。在多行形式中,它看起来像:
xxx.smr
或者,在一行中:
for i in *.smr; do
for j in ${i%.*}; do
rm -f "${j}_step?.*" "${j}_info.*"
done
rm -f "$i"
done
注意这将删除每个for i in *.smr; do for j in ${i%.*}; do rm -f "${j}_step?.*" "${j}_info.*"; done; rm -f "$i"; done
文件的所有xxx_step...
和xxx_info...
个文件。确保这是您想要的并首先在测试目录上运行。您可以通过将xxx.smr
替换为xxx_info.xlsx
等来强化上面的扩展程序以删除xxx_info.*
...