Script de renomeação de arquivo em lote trocando substrings no nome do arquivo?

Script de renomeação de arquivo em lote trocando substrings no nome do arquivo?

Eu tenho um grupo de arquivos chamado comotitle_december_word1_word2.pnge deseja iterar pelo diretório e trocar word1e word2dentro de cada arquivo.

ou seja, vá de button_december_state_pressed.png->button_december_pressed_state.png

Alguma sugestão sobre como posso conseguir isso?

A maioria dos programas em lote que encontrei para o OS X não pode especificar um caractere para dividir as palavras e eu esperava que alguém pudesse me ajudar com um script rápido para resolver isso.

Responder1

No bash, isso pode ser feito da seguinte maneira:

  for i in *; do echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3 }' ; done

Este comando primeiro encontra todos os arquivos no diretório atual e depois alimenta esses nomes (ele assumesem verificarque existem três sublinhados e um . nesses nomes de arquivo) para awk, que os reorganiza na ordem desejada.

A única parte complicada é que -F'[_.]'a opção -F' 'serve para identificar o delimitador entre os diferentes campos, e neste último caso o delimitador assume seu valor padrão, um espaço. Mas a opção -F'[_.]'define uma classe de caracteres de elementos intercambiáveis, neste caso sublinhado e ponto, que podem ser usados ​​à vontade como delimitadores.

Editar:

Ok, como isso funciona, sem realmente mover nada, agora podemos implementar o ato real de renomear os arquivos:

  for i in *; do ni=$(echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3"."$5 }') && mv "$i" "$ni" ; done

Responder2

Zsh ezmv

Se você tiver zsh (que é padrão no OS X), você pode usarzmv:

% zsh
% autoload -U zmv
% zmv 'title_december_(*)_(*).png' 'title_december_$2_$1.png'

Executaria o seguinte comando (use zmv -npara fazer uma simulação sem realmente renomear):

mv -- title_december_word1_word2.png title_december_word2_word1.png

Obviamente você pode ser um pouco mais flexível se as primeiras partes forem diferentes por imagem:

% zmv '(*)_(*)_(*).png' '$1_$3_$2.png' 
mv -- foo_bar_word1_word2.png foo_bar_word2_word1.png
mv -- title_december_word1_word2.png title_december_word2_word1.png

Isso funciona porque as partidas são gananciosas e, portanto, engolem todos os sublinhados até o último antes dos outros grupos de partidas.


Estilo Perlrename

No OS X você pode obterrenamecomCerveja caseira:

$ rename -n 's/(.*)_(.*)_(.*).png/$1_$3_$2.png/' *
'foo_bar_word1_word2.png' would be renamed to 'foo_bar_word2_word1.png'
'title_december_word1_word2.png' would be renamed to 'title_december_word2_word1.png'

A -nopção imprime apenas o que teria sido renomeado.

informação relacionada