我是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上?我如何在一个部分中调用它?
答案 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