การใช้คำสั่ง makefile wildcard สำหรับชื่อไฟล์ที่มีช่องว่าง


8

ฉันมี 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% "$@"

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

อย่างไรก็ตามเมื่อฉันมีรูปภาพที่มีช่องว่างในชื่อตัวอย่างเช่นPiper PA-28-236 Dakota.JPGฉันได้รับข้อผิดพลาดนี้:

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

ฉันคิดว่านี่เป็นปัญหาในwildcardคำสั่ง แต่ฉันไม่แน่ใจว่าจะเปลี่ยนเพื่อให้ทำงานได้

ฉันจะแก้ไข makefile ของฉันเพื่ออนุญาตให้มีช่องว่างในชื่อไฟล์ได้อย่างไร


ผมเคยถามคำถามนี้ในกองมากเกินที่นี่
iBelieve

คำตอบ:


4

ฉันถาม Stack Overflow และผู้ใช้ชื่อ perreal ช่วยฉันแก้ปัญหานี้นี่คือคำตอบของเขา

นี่คือสิ่งที่ฉันทำเพื่อให้มันทำงาน:

  1. ใช้src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')เพื่อแก้ไขปัญหาช่องว่างในwildcardคำสั่งและรับเป้าหมายเพื่อทำงานกับช่องว่าง

  2. ใบนี้เป็นเครื่องหมายคำถามในแฟ้มผลเพื่อใช้ฟังก์ชั่นการเรียกร้องให้เปลี่ยนที่มีพื้นที่ในแฟ้มสุดท้าย:? replace = echo $(1) | sed 's/?/ /g'เรียกสิ่งนี้ด้วย@convert "$<" -scale 20% "``$(call replace,$@)``"(ฉันใช้ backtick เพียงอันเดียว แต่ฉันไม่รู้วิธีที่จะแสดงอย่างถูกต้อง)

ดังนั้นนี่คือ Makefile สุดท้ายของฉัน:

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,$@)`"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.