我有一个用于压缩图片的 makefile:
src=$(wildcard Photos/*.jpg) $(wildcard Photos/*.JPG)
out=$(subst Photos,Compressed,$(src))
all : $(out)
clean:
@rmdir -r Compressed
Compressed:
@mkdir Compressed
Compressed/%.jpg: Photos/%.jpg Compressed
@echo "Compressing $<"
@convert "$<" -scale 20% "$@"
Compressed/%.JPG: Photos/%.JPG Compressed
@echo "Compressing $<"
@convert "$<" -scale 20% "$@"
但是,当我的图片名称中带有空格时,例如Piper PA-28-236 Dakota.JPG
,我会收到此错误:
make: *** No rule to make target `Compressed/Piper', needed by `all'. Stop.
我认为这是命令中的一个问题wildcard
,但我不确定要改变什么才能使它工作。
我如何修改 makefile 以允许文件名中有空格?
答案1
我在 Stack Overflow 上询问,一个名为 perreal 的用户帮助我解决了这个问题,这里这是他的回答。
以下是我为使它工作所做的事情:
用于
src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')
修复命令中的空格问题wildcard
并使目标能够与空格一起工作。这会在生成的文件中留下一个问号,因此请使用调用函数
?
在最终文件中替换为空格:replace = echo $(1) | sed 's/?/ /g'
。用它调用@convert "$<" -scale 20% "``$(call replace,$@)``"
(我只使用了一个反引号,但我不知道如何让它正确显示)。
以下是我的最终 Makefile:
src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')
out=$(subst Photos,Compressed,$(src))
replace = echo $(1) | sed 's/?/ /g'
all : $(out)
clean:
@rmdir -r Compressed
Compressed:
@mkdir Compressed
Compressed/%.jpg: Photos/%.jpg Compressed
@echo "Compressing $<"
@convert "$<" -scale 20% "`$(call replace,$@)`"
Compressed/%.JPG: Photos/%.JPG Compressed
@echo "Compressing $<"
@convert "$<" -scale 20% "`$(call replace,$@)`"