그림을 압축하는 데 사용하는 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을 어떻게 수정합니까?
답변
나는 스택 오버플로에 대해 물었고 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,$@)`"