Запуск скриптованих команд в makefile (Linux make)


0

Я боровся з цим найбільше минулої ночі.

Я хочу , щоб перейменувати всі файли xxxx-yyyyв xxxx:yyyyв папці з Makefile.

У мене є робота, renamefiles.shяка робить цю роботу чудово:

#!/bin/sh
for i in $i
 do
   echo $i
   echo mv "${i}" "${f//-/:}";
   mv "${i}" "${f//-/:}";
 done

Але я дуже хотів би помістити це все в makefile.

Makefile - з OpenWRT / Lede; фрагмент, де це має бути:

define Build/Prepare
 $(Build/Prepare/Default)
 tar xvfj $(DL_DIR)/$(PKG_DATA_FILENAME) -C $(PKG_BUILD_DIR)
 rm -f \
    $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/05c6:1000:sVe=GT
 cp ./data/* $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/

 ./renamefiles.sh $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/
endef

Тому я дуже хотів би, щоб у файлі makename було перейменовано $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/????-????на????:????

але що б я не намагався, я, здавалося, помилився (як правило, unexpected end of fileз bash?).

Я також шукаю рішення, яке буде працювати без додаткових передумов; наприклад, моє перше дослідження показало, що renameце зробить роботу непогано, але мене попередили, тому що воно доступне не скрізь.


1
1) for i in $iсправжня копія / вставка? чи не повинно бути for i in $*? 2) makefile call повинно бути./renamefiles.sh $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/????-????
Archemar

Також розглянути можливість використання renameкоманди (упакованої на багато дистрибутивів) з пергекс-стилем у стилі perl замість домашнього сценарію.
dirkt

@dirkt - див. нижче. "Перейменувати" було моїм першим вибором :).
Саймон Н

@Archemar - так, було пізно, і я вже видалив більшу частину своєї тестової роботи! дякую за виділення ...;
Саймон Н

Відповіді:


1

а не редагувати власне запитання; Я думав, що відповім на це питання, на яке питання слід звернутися.

Так, сценарій теж не працював ....

"робочий" сценарій такий:

#!/bin/bash
shopt -s nullglob
for i in $1*-*
do
    echo file is $i
    FILENAME=$(basename $i)
    echo filename is $FILENAME
    NEWNAME=${FILENAME//-/:}
    echo newname is $NEWNAME
    rm "$1$NEWNAME"
    mv "$1$FILENAME" "$1$NEWNAME"
done

тому; виправлення:

  1. $ 1 після.

  2. заміна в імені файлу інша в #! / bin / sh і #! / bin / bash - в основному $ {FILENAME // - /:} не працює в MY #! / bin / sh .... (зверніть увагу на $ {var // xyz / abc} - дві косої риси означають "замінити ВСІЙ xyz на abc, один означатиме повторне використання першого xyz на abc. Також зауважте, що дефіс МОЖЕ бути уникнути, оскільки він може вказувати на показник діапазону).

  3. додати цикл "shopt -s nullglob" перед циклом for, інакше, якщо НІМАЄ відповідних файлів, це дасть вам шаблон пошуку як файл ....

  4. робіть субст лише для імені файлів, оскільки шлях мав багато дефісних каталогів!

використання 'перейменувати' - підтримка проекту не дозволила :(.

Тепер, щоб помістити його в makefile.

  1. Моїм оригінальним випуском було те, що я не міг пройти "баш - несподіваний кінець файлу". Насправді просто - ОБОВ'ЯЗКОВО бути ефективним на одній лінії. кінцеві рядки з (пробіл); (пробіл) \, щоб викликати використання bash ';' як маркер кінця рядка, і використовуйте "\", щоб вказати, що ви хочете, щоб все, що подається, перетворилося на ту саму лінію.

  2. Використання $. Я читав у безлічі місць, що у makefiles, якщо ви використовували $ для переходу до bash, тоді вам довелося використовувати два (тобто $$ FILENAME). Але мені довелося використовувати ЧЕТВЕР ($$$$ FILENAME). Все, що я можу припустити, на цьому етапі - це те, що у складній системі нарощування Lede / Openwrt makefiles входить деяким чином, включає в себе, і я знайшов лише 4 шляхом експерименту. Я не бачив цього в жодному з інших відповідей на запитання щодо циклів у makefiles :).

Таким чином, остаточний фрагмент makefile: (зверніть увагу на знімок, щоб він працював, навіть якщо файлів не знайдено)

shopt -s nullglob ; \
for filevar in $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/*-* ; \
do \
    echo file is $$$$filevar ; \
    FILENAME=$$$$(basename $$$$filevar) ; \
    echo filename is $$$$FILENAME ; \
    NEWNAME=$$$${FILENAME//-/:} ; \
    echo newname is $$$$NEWNAME ; \
    echo 'rm "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$NEWNAME"' ; \
    echo 'mv "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$FILENAME" "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$NEWNAME"' ; \
    rm "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$NEWNAME" ; \
    mv "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$FILENAME" "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$NEWNAME" ; \
done
ls $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/

Я сподіваюся, що ця інформація допомагає комусь іншому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.