Arquivo de lote renomeia script que troca substrings em nome de arquivo?

1

Eu tenho um grupo de arquivos chamado title_december_word1_word2.png e quero fazer uma iteração pelo diretório e trocar word1 e word2 dentro de cada arquivo.

i.e. vá de button_december_state_pressed.png - > button_december_pressed_state.png

Alguma sugestão de como eu posso conseguir isso?

A maioria dos programas em lote que eu 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.

    
por user1911904 05.12.2013 / 16:05

2 respostas

1

No bash, isso pode ser feito da seguinte forma:

  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, em seguida, alimenta esses nomes (assume sem verificar que há três sublinhados e um. nesses nomes de arquivo) para awk, que os reorganiza a ordem que você deseja.

A única parte complicada é -F'[_.]' A opção -F' ' é usada para identificar o delimitador entre 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 caractere 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
    
por 05.12.2013 / 17:05
2

Zsh e zmv

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

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

O seguinte comando seria executado (use zmv -n para executar uma execuçã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 jogos.

Perl-style rename

No OS X, você pode obter rename com Homebrew :

$ 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 opção -n imprime apenas o que teria sido renomeado.

    
por 05.12.2013 / 16:43