WedX - журнал о программировании и компьютерных науках

Использование подстановочной команды makefile для имен файлов с пробелами

У меня есть make-файл, который я использую для сжатия изображений:

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, но я не уверен, что нужно изменить, чтобы заставить ее работать.

Как я могу изменить свой make-файл, чтобы разрешить пробелы в именах файлов?

20.12.2012

Ответы:


1

Как правило, наличие пробелов в именах файлов — плохая идея с make, но в вашем случае это может сработать:

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% "$@"
20.12.2012
  • Спасибо за вашу помощь, это работает, чтобы исправить пробелы в проблеме с подстановочными знаками. Я изменил его на src=$(shell ls Photos | sed 's/ /\\ /g;s/.*/Photos\/\0/'), чтобы разрешить JPG и jpg. Однако теперь я получаю сообщение об ошибке make: *** No rule to make target 'Compressed/Piper PA-28-236 Dakota.JPG', needed by 'all'. Stop. Итак, теперь мне нужно выяснить, как заставить работать цели с пробелами. 20.12.2012
  • У меня все получилось, спасибо за вашу помощь. Замена на ? устраняет проблему с целями, но добавляет ? в результирующий файл. В итоге я использовал функцию вызова: replace = echo $(1) | sed 's/?/ /g', а затем использовал ее с этой командой: @convert "$<" -scale 20% "`$(call replace,$@)`" 20.12.2012
  • Должен ли я принять ваш ответ или мне следует создать свой собственный ответ с подробным описанием всего, что я сделал, чтобы заставить его работать, показывая окончательный Makefile? 20.12.2012
  • Хммм, когда я добавляю новое изображение в каталог Photos или удаляю одно из сжатых изображений из каталога Compressed, Makefile сжимает ВСЕ изображения, а не только новое или без сжатой версии. 20.12.2012
  • Спасибо за обновленный ответ, он намного проще. Однако проблема, которую я описал в своем последнем комментарии, все еще возникает. 22.12.2012
  • @iBelieve, если сделать два раза подряд, не добавляя и не удаляя ни одной фотографии, сжимает и пересжимает все картинки? Или все картинки с космическими названиями? Возможно, GNU Make использует небезопасные для пространства переменные $^ и $? внутренне, чтобы следить за тем, какие предварительные требования являются новыми, несостоятельными и предполагают, что все предварительные условия являются новыми. Это ошибка в GNU Make, которую можно исправить обратно совместимым образом. 05.04.2020
  • Неважно, я протестировал аналогичную установку, но называл цели без пробелов в именах файлов, несмотря на то, что имена необходимых файлов содержали пробелы, а GNU Make 4.3 не перестраивался без необходимости. 05.04.2020
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]