J'ai un makefile que j'utilise pour compresser les images:
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% "$@"
Cependant, lorsque j'ai une image avec un espace dans son nom, par exemple Piper PA-28-236 Dakota.JPG
, j'obtiens cette erreur:
make: *** No rule to make target `Compressed/Piper', needed by `all'. Stop.
Je pense que c'est un problème dans la wildcard
commande, mais je ne sais pas quoi changer pour le faire fonctionner.
Comment modifier mon makefile pour autoriser les espaces dans les noms de fichiers?
Réponses:
J'ai demandé sur Stack Overflow et un utilisateur nommé perreal m'a aidé à résoudre ce problème, voici sa réponse.
Voici ce que j'ai fait pour le faire fonctionner:
Permet
src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')
de résoudre le problème des espaces dans lawildcard
commande et d'obtenir des cibles pour travailler avec les espaces.Cela laisse un point d'interrogation dans le fichier résultant, utilisez donc une fonction d'appel pour remplacer
?
un espace dans le fichier final:replace = echo $(1) | sed 's/?/ /g'
. Appelez cela avec@convert "$<" -scale 20% "``$(call replace,$@)``"
(je n'ai utilisé qu'un seul backtick, mais je ne sais pas comment l'afficher correctement).Alors, voici mon Makefile final:
la source