Mam plik makefile, którego używam do kompresji zdjęć:
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% "$@"
Jednak na przykład, gdy mam zdjęcie ze spacją w jego nazwie, pojawia Piper PA-28-236 Dakota.JPG
się ten błąd:
make: *** No rule to make target `Compressed/Piper', needed by `all'. Stop.
Myślę, że jest to problem w wildcard
poleceniu, ale nie jestem pewien, co zmienić, aby uruchomić.
Jak zmodyfikować mój plik makefile, aby zezwolić na spacje w nazwach plików?
Odpowiedzi:
Zapytałem na Stack Overflow, a użytkownik o imieniu perreal pomógł mi rozwiązać ten problem, oto jego odpowiedź.
Oto, co zrobiłem, aby to działało:
Służy
src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')
do rozwiązania problemu ze spacjami wwildcard
poleceniu i doprowadzenia obiektów docelowych do pracy ze spacjami.Pozostawia to znak zapytania w pliku wynikowego, więc korzystać z funkcji połączenia, aby wymienić
?
z miejsca w końcowej pliku:replace = echo $(1) | sed 's/?/ /g'
. Zadzwoń za pomocą@convert "$<" -scale 20% "``$(call replace,$@)``"
(użyłem tylko jednego kliknięcia wstecznego, ale nie wiem, jak go poprawnie wyświetlić).Oto mój końcowy plik Makefile:
źródło