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

0

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

Eu quero renomear todos os arquivos xxxx-yyyypara xxxx:yyyyuma pasta de um makefile.

Eu tenho um renamefiles.shque 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 o que eu tentei, eu parecia ter algum erro (geralmente unexpected end of filede bash?).

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

Simon H
fonte
1
1) é for i in $iuma cópia / colagem real? não deveria ser for i in $*? 2) chamada makefile deve ser./renamefiles.sh $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/????-????
Archemar
Considere também usar o renamecomando (empacotado em várias distros) com regexp no estilo perl em vez de um script caseiro.
dirkt
@dirkt - veja abaixo. 'renomear' foi minha primeira escolha :).
Simon H
@Archemar - sim, já era tarde, e eu já havia deletado a maior parte do meu trabalho de teste! obrigado por destacar ...;
Simon H

Respostas:

1

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

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

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 for.

  2. 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, um simples significaria repalir o primeiro xyz com abc. Observe também que o hífen pode precisar ser escapado, 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. do subst apenas no nome do arquivo, já que 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 poderia passar 'bash - fim inesperado do arquivo'. 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 (ie $$ 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 of 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 trecho final do arquivo de criação: (observe o shopt para que ele funcione mesmo se nenhum arquivo for 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.

Simon H
fonte