对带空格的文件名使用 makefile 通配符命令

iBe*_*eve 8 makefile

我有一个用于压缩图片的 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% "$@"
Run Code Online (Sandbox Code Playgroud)

但是,例如,当我的图片名称中带有空格时Piper PA-28-236 Dakota.JPG,会出现以下错误:

make: *** No rule to make target `Compressed/Piper', needed by `all'.  Stop.
Run Code Online (Sandbox Code Playgroud)

我认为这是wildcard命令中的一个问题,但我不确定要更改什么才能使其正常工作。

如何修改我的 makefile 以允许文件名中包含空格?

iBe*_*eve 4

我在 Stack Overflow 上询问,一位名叫 perreal 的用户帮我解决了这个问题,是他的答案。

这是我为了让它发挥作用所做的事情:

  1. 用于src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')修复命令中的空格问题wildcard并使目标能够使用空格。

  2. 这会在生成的文件中留下一个问号,因此请使用调用函数?在最终文件中替换为空格: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,$@)`"
Run Code Online (Sandbox Code Playgroud)