Saya memiliki makefile yang saya gunakan untuk mengompres gambar:
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% "$@"
Namun, ketika saya memiliki gambar dengan spasi di namanya, misalnya Piper PA-28-236 Dakota.JPG
, saya mendapatkan kesalahan ini:
make: *** No rule to make target `Compressed/Piper', needed by `all'. Stop.
Saya pikir ini adalah masalah dalam wildcard
perintah, tetapi saya tidak yakin apa yang harus diubah untuk membuatnya berfungsi.
Bagaimana cara memodifikasi makefile saya untuk memungkinkan spasi dalam nama file?
Jawaban:
Saya bertanya pada Stack Overflow dan seorang pengguna bernama perreal membantu saya untuk menyelesaikan ini, inilah jawabannya.
Inilah yang saya lakukan untuk membuatnya bekerja:
Gunakan
src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')
untuk memperbaiki masalah spasi dalamwildcard
perintah dan dapatkan target untuk bekerja dengan spasi.Ini daun tanda tanya dalam file yang dihasilkan, sehingga menggunakan fungsi panggilan untuk mengganti
?
dengan ruang dalam file akhir:replace = echo $(1) | sed 's/?/ /g'
. Sebut ini dengan@convert "$<" -scale 20% "``$(call replace,$@)``"
(saya hanya menggunakan satu backtick, tapi saya tidak tahu bagaimana cara menampilkannya dengan benar).Jadi, inilah Makefile terakhir saya:
sumber