Eu tenho um grupo de arquivos chamado comotitle_december_word1_word2.pnge deseja iterar pelo diretório e trocar word1
e word2
dentro 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 -n
para 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 obterrename
comCerveja 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 -n
opção imprime apenas o que teria sido renomeado.