Eu lutei com isso durante a maior parte da noite passada.
Eu quero renomear todos os arquivos xxxx-yyyy
para xxxx:yyyy
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 o que eu tentei, eu parecia ter algum erro (geralmente 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.
for i in $i
uma cópia / colagem real? não deveria serfor i in $*
? 2) chamada makefile deve ser./renamefiles.sh $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/????-????
rename
comando (empacotado em várias distros) com regexp no estilo perl em vez de um script caseiro.Respostas:
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:
então; correções:
$ 1 após o for.
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).
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 ....
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.
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.
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)
Espero que esta informação ajude alguém.
fonte