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 perldorename
comando(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 rename
seja uma ferramenta muito poderosa, normalmente prefiro a simplicidade dommv
utilitá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 *
, mmv
suporta intervalos de caracteres entre colchetes (como [a-f]
).
( mmv
testará 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-rename
comando, que pode usar um regex estilo perl para renomear arquivos em massa. O rename
comando aceita apenas um par de strings fixas para renomear.