У меня есть make-файл, который я использую для сжатия изображений:
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
команда, но я не уверен, что измениться, чтобы заставить ее работать.
Как я изменяю свой make-файл для обеспечения пробелов в именах файлов?
Я спросил относительно Переполнения стека, и названный perreal пользователя помог мне решить это, вот его ответ.
Вот то, что я сделал, чтобы заставить это работать:
Использовать src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')
решить проблему пробелов в wildcard
управляйте и заставьте цели работать с пробелами.
Это оставляет вопросительный знак в получающемся файле, так используйте функцию вызова для замены ?
с пространством в заключительном файле: replace = echo $(1) | sed 's/?/ /g'
. Назовите это с @convert "$<" -scale 20% "``$(call replace,$@)``"
(Я только использовал одну обратную галочку, но я не знаю, как заставить ее отображаться правильно).
Так, вот мой заключительный Make-файл:
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,$@)`"