Renomear arquivos e adicionar travessões após o quarto e sexto caracteres

Renomear arquivos e adicionar travessões após o quarto e sexto caracteres

Tenho alguns arquivos como:

20150716_something-here
20150716_something-heretoo
20150716_something-hereaswell

Eles precisam ser renomeados como

2015-07-16_something-here
2015-07-16_something-heretoo
2015-07-16_something-hereaswell

Eu tentei usar umimplementação perldorenamecomando(veja meu comentário sobre a resposta aceita), mas não tive sucesso.

Responder1

Usando a expansão de substring integrada do bash:

for f in 2015* ; do
  mv "$f" "${f::4}-${f:4:2}-${f:6}"
done

Responder2

Com sed:

LC_ALL=C sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1_\2_\3/' <file

Responder3

Embora renameseja uma ferramenta muito poderosa, normalmente prefiro a simplicidade dommvutilitário (movimento múltiplo):

mmv '????????_*' '#1#2#3#4-#5#6-#7#8_#9'

O ?no padrão de pesquisa representa um único caractere, o *para uma sequência arbitrariamente longa de caracteres. No padrão de substituição, cada #<number>representa um correspondente ?ou *no padrão de pesquisa. Além de ?e *, mmvsuporta intervalos de caracteres entre colchetes (como [a-f]).

( mmvtestará se há conflitos na renomeação antes de começar a funcionar, para que você não corra o risco de perder arquivos ao sobrescrevê-los.)

Responder4

Na minha distribuição eu tenho o perl-renamecomando, que pode usar um regex estilo perl para renomear arquivos em massa. O renamecomando aceita apenas um par de strings fixas para renomear.

informação relacionada