スペースを含むファイル名にmakefileワイルドカードコマンドを使用する


8

画像の圧縮に使用するメイクファイルがあります。

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コマンドの問題だと思いますが、それを機能させるために何を変更すればよいかわかりません。

メイクファイルを変更してファイル名にスペースを含めるにはどうすればよいですか?


ここでStack Overflow この質問をしまし
iBelieve、

回答:


4

私は、スタックオーバーフローの上に尋ねたとperrealという名前のユーザーは、この問題を解決するために私を助けここに彼の答えはあります。

これを機能させるために私がしたことは次のとおりです。

  1. コマンドのsrc=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')スペースの問題を修正し、wildcardターゲットをスペースで機能させるために使用します。

  2. これにより、結果のファイルに疑問符が残るため、call関数を使用?して、最終的なファイルのスペースに置き換えますreplace = echo $(1) | sed 's/?/ /g'。これを呼び出します@convert "$<" -scale 20% "``$(call replace,$@)``"(バックティックを1つだけ使用しましたが、正しく表示する方法がわかりません)。

それで、これが私の最終的な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.