使用 Makefile 修改文件扩展名

Modifying file extensions using Makefiles

我是 Makefile 的新手,我想修改一组文件的扩展名。以下命令适用于 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 上完成这项工作?我如何在一个部分中调用它?

您的问题的直接答案是 $ 字符对于 make 来说是特殊的:它引入了一个 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 个移动命令...

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

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