GNU make:我可以删除过时的文件吗?

时间:2015-04-08 02:40:13

标签: matlab makefile

在我的工作流程中,我在文件夹中有很多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.matC_step3.mat都比其直接先决条件更新(而不是A.smrC.smr )。但是,实际上我需要删除B.smr的所有后代,例如B_step1.matB_step2.matB_step3.matB_info.xlsx。如果保留了这些过时的文件,最终目标B_step3.mat将包含在后续分析中并影响结果。

我想知道是否有一个" smart"删除相应的xxx_step1.mat文件时删除xxx_step2.matxxx_step3.matxxx_info.xlsxxxx.smr文件的方法。

或者我应该用MATLAB或Python等实现这个?

1 个答案:

答案 0 :(得分:1)

由于Makefile是shell命令的集合,因此您可以在clean:目标上使用{{1}收集和删除与xxx.smr文件对应的所有文件} loop和参数扩展/子串匹配。要查找与每个for文件对应的所有文件,请查找所有xxx.smr个文件。然后,对于每个xxx.smr,提取xxx.smr并删除所有xxxxxx_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.* ...