Executando comandos com script dentro de um makefile (make do Linux)

0

Eu lutei com isso durante a maior parte da noite passada.

Desejo renomear todos os arquivos xxxx-yyyy para xxxx:yyyy em uma pasta de um makefile.

Eu tenho um renamefiles.sh que faz o trabalho bem:

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

Mas eu realmente gostaria de colocar isso dentro de um makefile.

O makefile é do OpenWRT / Lede; o trecho onde ele precisa estar é:

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

Então, eu realmente gostaria de, no makefile, renomear $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/????-???? para ????:????

mas, independentemente do que tentei, pareceu-me obter algum erro (normalmente unexpected end of file de bash ?).

Também estou procurando uma solução que funcione sem pré-requisitos adicionais; por exemplo. minha primeira pesquisa indicou que rename faria o trabalho muito bem, mas eu fui advertido porque não está disponível em todos os lugares.

    
por Simon H 10.10.2016 / 10:59

1 resposta

1

em vez de editar minha própria pergunta; Eu pensei em responder, então a questão está aí para se referir.

Sim, o script também não funcionou ...

o script 'working' é o seguinte:

#!/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

então; correções:

  1. $ 1 após o para.

  2. a substituição no nome do arquivo é diferente em #! / bin / sh e #! / bin / bash - basicamente $ {FILENAME // - /:} não funciona em MY #! / bin / sh .... (nota sobre $ {var // xyz / abc} - as duas barras significam 'substitua EVERY xyz por abc, a single significaria repalir o primeiro xyz com abc. Além disso, note que o hífen pode precisar de escape, pois pode indicar um indicador de intervalo).

  3. adicione 'shopt -s nullglob' antes do loop for, senão, se não houver arquivos correspondentes, ele fornecerá o padrão de pesquisa como um arquivo ....

  4. faça subst apenas no nome do arquivo, pois o caminho tinha muitos diretórios hifenizados!

uso de 'renomear' - não foi permitido pelo mantenedor do projeto: (.

Agora vamos colocá-lo no makefile.

  1. Meu problema original foi que eu não consegui passar 'bash - fim de arquivo inesperado'. Simples realmente - tudo deve ser efetivamente em uma linha. linhas finais com (espaço); (espaço) \ para fazer com que o bash use o ';' como um marcador de fim de linha, e use o '\' para indicar que você quer que tudo seja apresentado na mesma linha.

  2. Uso de $. Eu li em muitos lugares que em makefiles, se você estava usando $ para passar para bash, então você tinha que usar dois (ou seja, $$ FILENAME). Mas eu tive que usar FOUR ($$$$ FILENAME). Tudo o que posso supor neste ponto é que no complexo sistema buildroot de Lede / Openwrt, os makefiles são inclusos de includes de includes de alguma forma, e eu só encontrei 4 por experimentação. Eu não vi isso em nenhuma das outras perguntas respondidas sobre loops em makefiles:).

então, o snippet final do makefile: (observe o shopt para que ele funcione mesmo que nenhum arquivo seja encontrado)

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/

Espero que esta informação ajude alguém.

    
por 11.10.2016 / 19:15