Eu tenho um script bash que estou tentando substituir pontos nos nomes de arquivos e substituí-los por sublinhados, deixando a extensão intacta (estou no Centos 6 btw). Como você pode ver na saída abaixo, o script funciona quando há um ponto a substituir, mas nos casos em que o único ponto é a extensão, o script ainda tenta renomear o arquivo, em vez de ignorá-lo. Alguém pode apontar como devo lidar melhor com isso? Obrigado por qualquer ajuda.
Meu script (defeituoso):
#!/bin/bash
for THISFILE in *
do
filename=${THISFILE%\.*}
extension=${THISFILE##*\.}
newname=${filename//./_}
echo "mv $THISFILE ${newname}.${extension}"
#mv $THISFILE ${newname}.${extension}
done
Entrada de amostra:
1.3MN-Pin-Eurotunnel-Stw505.51.024-EGS-130x130.jpg
Wear-Plates.jpg
Resultado:
mv 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg
mv Wear-Plates_jpg.Wear-Plates_jpg Wear-Plates_jpg.Wear-Plates_jpg
tar.gz
arquivos? Você gostaria que eles resolvessemfile.tar.gz
, nãofile_tar.gz
.Respostas:
Acredito que este programa fará o que você deseja. Eu testei e funciona em vários casos interessantes (como nenhuma extensão):
O principal problema que você teve foi que a
##
expansão não estava fazendo o que você queria. Eu sempre considerei a expansão de parâmetros do shell no bash algo como uma arte negra. As explicações no manual não são completamente claras e eles não têm exemplos de suporte de como a expansão deve funcionar. Eles também são bastante enigmáticos.Pessoalmente, eu teria escrito um pequeno script
sed
que brincava com o nome do jeito que eu queria, ou um pequeno scriptperl
que fazia a coisa toda. Uma das outras pessoas que responderam adotou essa abordagem.Outra coisa que gostaria de destacar é o uso de citações. Toda vez que faço algo com scripts de shell, lembro às pessoas que tenham muito cuidado com suas citações. Uma enorme fonte de problemas nos scripts de shell é a interpretação de shell que não deveria. E as regras de cotação estão longe de serem óbvias. Acredito que esse script shell esteja livre de problemas de citação.
fonte
Use
for thisfile in *.*.*
(ou seja, faça um loop sobre arquivos com dois pontos ou mais em seu nome). Lembre-se de citar suas variáveis e use--
para marcar o final das opções como emmv -- "$thisfile" "$newname.$extension"
Com zsh.
fonte
Que tal agora:
AVISO LEGAL: tente primeiro em um diretório fictício, eu não testei!
fonte
/
.Parece que algumas boas respostas já estão disponíveis, mas aqui está outra usando
tr
esed
:fonte
sed
decide a qual.*
aplicar o maximo máximo? Eu me sentiria muito melhor se o segundo.*
fosse[^_]*
.\t
caracteres.echo -n "$file"
podia funcionar. :-) Ah, e"
está em torno da$( ... )
expressão (aka"$( ... )"
) faria isso.Esta versão permite que você selecione explicitamente o número de pontos que deseja manter, começando pelo lado direito.
Além disso, ele substituirá e / ou excluirá outros caracteres, além de pontos, e o caractere de substituição será
-
substituído por um sublinhado, mas isso pode ser facilmente alterado.fonte