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 após o para.
-
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).
-
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 ....
-
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.
-
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.
-
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.