Como posso renomear nomes de arquivos em lote no console

4

Eu tenho um grande número de arquivos cujo nome é "img800400_497708.307247.png", e gostaria de alterar todos os pontos (pontos) para um sublinhado usando o console. Como posso fazer isso?

    
por user3601754 27.04.2015 / 16:21

2 respostas

6

Você pode fazer isso com bastante facilidade com o comando rename . O único problema é preservar a extensão. Começamos substituindo todos os pontos, mas depois substituímos _png por .png . Você obviamente precisará adaptar isso para outros tipos de extensão.

cd /path/to/images
rename 's/\./_/g; s/_png$/.png/' *.png -vn

Nota: o -vn no final só demonstrará o que faria. É um gatilho de segurança. Verifique se o comando faz o que você quer e então remova a última parte.

Um equipamento de teste super simples:

$ touch file.{01..10}.png
$ rename 's/\./_/g; s/_png$/.png/' *.png -vn
file.01.png renamed as file_01.png
file.02.png renamed as file_02.png
file.03.png renamed as file_03.png
file.04.png renamed as file_04.png
file.05.png renamed as file_05.png
file.06.png renamed as file_06.png
file.07.png renamed as file_07.png
file.08.png renamed as file_08.png
file.09.png renamed as file_09.png
file.10.png renamed as file_10.png
    
por Oli 27.04.2015 / 16:25
0

Uma solução bash que remove a extensão, substitui os pontos por sublinhados e adiciona novamente a extensão:

for f in *.png; do g="${f%.*}"; echo mv -- "$f" "${g//./_}.png"; done

Remova o echo depois de se certificar de que está funcionando. Ele poderia facilmente ser estendido para uma extensão geral .ext se você tiver mais de um tipo de arquivo, por exemplo

for f in *.*; do g="${f%.*}"; e="${f##*.}"; echo mv -- "$f" "${g//./_}.$e"; done
    
por steeldriver 27.04.2015 / 16:42

Tags