Sử dụng lệnh makefile wildcard cho tên tệp có dấu cách


8

Tôi có một tệp thực hiện mà tôi sử dụng để nén ảnh:

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% "$@"

Tuy nhiên, khi tôi có một hình ảnh có một khoảng trắng trong tên của nó Piper PA-28-236 Dakota.JPG, tôi gặp lỗi này:

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

Tôi nghĩ rằng đây là một vấn đề trong wildcardlệnh, nhưng tôi không biết phải thay đổi gì để nó hoạt động.

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


Tôi đã hỏi câu hỏi này trên Stack Overflow tại đây .
iBelease

Câu trả lời:


4

Tôi đã hỏi trên Stack Overflow và một người dùng có tên perreal đã giúp tôi giải quyết vấn đề này, đây là câu trả lời của anh ấy.

Đây là những gì tôi đã làm để làm cho nó hoạt động:

  1. Sử dụng src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')để khắc phục vấn đề khoảng trắng trong wildcardlệnh và khiến các mục tiêu hoạt động với khoảng trắng.

  2. Điều này để lại một dấu hỏi trong tệp kết quả, vì vậy hãy sử dụng chức năng gọi để thay thế ?bằng một khoảng trắng trong tệp cuối cùng : replace = echo $(1) | sed 's/?/ /g'. Gọi cái này với @convert "$<" -scale 20% "``$(call replace,$@)``"(Tôi chỉ sử dụng một backtick, nhưng tôi không biết làm thế nào để nó hiển thị chính xác).

Vì vậy, đây là Makefile cuối cùng của tôi:

src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')
out=$(subst Photos,Compressed,$(src))

replace = echo $(1) | sed 's/?/ /g'

all : $(out)

clean:
    @rmdir -r Compressed

Compressed:
    @mkdir Compressed

Compressed/%.jpg: Photos/%.jpg Compressed
    @echo "Compressing $<"
    @convert "$<" -scale 20% "`$(call replace,$@)`"

Compressed/%.JPG: Photos/%.JPG Compressed
    @echo "Compressing $<"
    @convert "$<" -scale 20% "`$(call replace,$@)`"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.