2012-12-20 20 views
13

Tôi có một makefile mà tôi sử dụng để nén hình ảnh:Sử dụng lệnh wildcard makefile cho tên tập tin với không gian

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]" 

Tuy nhiên, khi tôi có một bức tranh với một không gian trong tên của nó, ví dụ Piper PA-28-236 Dakota.JPG, tôi nhận được lỗi này:

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

Tôi nghĩ rằng đây là sự cố trong lệnh wildcard, nhưng tôi không biết phải thay đổi gì để làm việc đó.

Làm cách nào tôi có thể sửa đổi tệp makefile của mình để cho phép các khoảng trắng trong tên tệp?

Trả lời

7

Nói chung có khoảng trống trong tên tập tin là một ý tưởng tồi với make, nhưng đối với trường hợp của bạn có thể làm việc này:

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

Nhờ sự giúp đỡ của bạn, mà làm việc để sửa chữa các khoảng trống trong vấn đề ký tự đại diện. Tôi đã sửa đổi nó thành 'src = $ (shell ls Ảnh | sed 's// \\/g; s /.*/ Ảnh \/\ 0 /')' để cho phép 'JPG' và' jpg'. Tuy nhiên, bây giờ tôi nhận được lỗi 'make: *** Không có quy tắc để thực hiện mục tiêu' Nén/Piper PA-28-236 Dakota.JPG ', cần thiết cho' tất cả '. Stop.' Vì vậy, bây giờ tôi cần phải tìm ra cách để có được mục tiêu với không gian để làm việc. – iBelieve

+1

Tôi đã nhận được nó để làm việc, cảm ơn tất cả sự giúp đỡ của bạn. Thay thế bằng '?' Sửa vấn đề mục tiêu, nhưng thêm một '?' Vào tập tin kết quả. Tôi đã kết thúc bằng cách sử dụng một chức năng gọi: 'replace = echo $ (1) | sed 's /?// g'' và sau đó sử dụng nó với lệnh này: '@convert" $ <"-scale 20%" \ '$ (gọi thay thế, $ @) \' "' – iBelieve

+0

Tôi có nên chấp nhận câu trả lời của bạn không hoặc tôi nên tạo câu trả lời của riêng mình chi tiết tất cả những gì tôi đã làm để làm cho nó hoạt động, hiển thị Makefile cuối cùng? – iBelieve

Các vấn đề liên quan