使用Makefile修改文件扩展名

时间:2015-03-07 23:32:34

标签: makefile

我是Makefiles的新手,我想修改一组文件的扩展名。以下命令适用于shell:

for file in path/*.ext1; do j=`echo $file | cut -d . -f 1`;j=$j".ext2";echo mv $file $j; done

但是,我不确定如何在Makefile中运行它。我试过跑

$(shell for file in path/*.ext1; do j=`echo $file | cut -d . -f 1`;j=$j".ext2";echo mv $file $j; done)

但这从未做过我需要做的事情。我需要做什么才能使这个工作在Makefile上?我如何在一个部分中调用它?

2 个答案:

答案 0 :(得分:0)

你的问题的直接答案是$字符是特殊的:它引入了一个make变量。如果您想将$传递给shell,则必须编写其中两个:$$

因此,您的shell函数调用必须写为:

$(shell for file in path/*.ext1; do j=`echo $$file | cut -d . -f 1`;j=$$j".ext2";echo mv $$file $$j; done)

然而,这几乎肯定不是一个做你想要的好方法。但是,你并没有真正清楚地描述你想做什么。如果您只想在makefile中创建一个可以调用以进行此更改的目标,则可以使用:

fixext:
        for file in path/*.ext1; do \
            j=`echo $$file | cut -d . -f 1`; \
            j=$$j".ext2"; \
            echo mv $$file $$j; \
        done

或者,利用一些有用的shell快捷方式,您可以运行:

fixext:
        for file in path/*.ext1; do \
            echo mv $$file $${file%.*}.ext2; \
        done

现在,如果您运行make fixext,它将执行这些步骤。

但是,更多类似于make的方法是编写一个知道如何重命名一个文件的规则,然后使用先决条件将它们全部重命名:

TARGETS = $(patsubst %.ext1,%.ext2,$(wildcard path/*.ext1))

fixext: $(TARGETS)

%.ext2 : %.ext1
        mv $< $@

现在你甚至可以运行make -j5并同时执行5个移动命令...

答案 1 :(得分:0)

您还可以在文件顶部添加重命名块,例如,更改后缀

output := $(input:.mov=.mp4)

但是据我所知,这在make命令中不起作用

check:
    output := $(input:.mov=.mp4)

给予

$ input=walkthrough.mov make check
output := walkthrough.mp4
make: output: No such file or directory
make: *** [check] Error 1