使用 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
我是 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