공백이있는 파일 이름에 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% "$@"

그러나 이름에 공백이있는 그림 Piper PA-28-236 Dakota.JPG이 있으면이 오류가 발생합니다.

make: *** No rule to make target `Compressed/Piper', needed by `all'.  Stop.

나는 이것이 wildcard명령 에서 문제라고 생각 하지만, 그것을 작동시키기 위해 무엇을 바꿔야할지 모르겠다.

파일 이름에 공백을 허용하도록 makefile을 어떻게 수정합니까?



답변

나는 스택 오버플로에 대해 물었고 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,$@)`"