2012-12-20 52 views
13

我有,我用它來壓縮圖片生成文件:使用以空格的文件名的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% "[email protected]" 

Compressed/%.JPG: Photos/%.JPG Compressed 
    @echo "Compressing $<" 
    @convert "$<" -scale 20% "[email protected]" 

然而,當我在它的名稱空間的圖片,例如Piper PA-28-236 Dakota.JPG,我得到這個錯誤:

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

我認爲這是在wildcard命令有問題,但我不知道該怎麼改才能正常工作。

如何修改我的makefile以允許文件名中的空格?

回答

7

通常具有文件名中的空格是一個壞主意與化妝,但你的情況,這可能工作:

src=$(shell find Photos/ -iname '*.JPG' | sed 's/ /\\ /g') 

out=$(subst Photos,Compressed,$(src)) 

all : $(out) 

Compressed: 
    @mkdir Compressed 

Compressed/%: Photos/% Compressed 
    @echo "Compressing $<" 
    @convert "$<" -scale 20% "[email protected]" 
+0

感謝您的幫助,該工程修復的空間中通配符的問題。我將它修改爲'src = $(shell ls Photos | sed's// \\/g; s /.*/ Photos \/\ 0 /')'以允許'JPG'和'jpg'。然而,現在我得到錯誤'make:***沒有規則來製作'all'所需的'Compressed/Piper PA-28-236 Dakota.JPG'。 Stop.'所以現在我需要弄清楚如何讓空間的目標工作。 – iBelieve

+1

我得到它的工作,感謝您的幫助。用'?'替換解決了目標問題,但在結果文件中添加了一個'?'。我最終使用了一個調用函數:'replace = echo $(1)|然後在這個命令中使用它:'@convert'$ <「-scale 20%」\'$(call replace,$ @)''' – iBelieve

+0

我應該接受你的答案還是應該創建自己的答案,詳細說明我所做的所有工作,並顯示最終的Makefile? – iBelieve