Batch renomeia os diretórios com regex via linha de comando no Linux

2

Eu tenho uma pasta no servidor que contém diretórios que são criados diariamente e são nomeados por data, assim:

07-06-14
08-06-14
09-06-14

etc.

Em algum momento, decidi que uma nomenclatura preferida estaria no seguinte formato: 2014-06-07 E as novas pastas são criadas com esse formato. Então agora a pasta contém os dois: diretórios no formato antigo e o novo.

Como faço para renomear em lote os diretórios no formato antigo para o novo?

Eu tentei isto: rename -n 's/(\d{2})\-(\d{2})\-(\d{2})$3-$2-$1//' *

Mas isso gera erros: Use of uninitialized value $2 in regexp compilation at (eval 1) line 1

    
por YemSalat 15.06.2014 / 21:15

2 respostas

5

Sua expressão regular está quebrada, acho que você quis dizer algo assim:

's/(\d{2})-(\d{2})-(\d{2})/20$3-$2-$1/'

i.e. hífens não precisam escapar e a segunda barra estava fora do lugar.

Observe que, com essa substituição, você também renomeia os arquivos com o novo esquema de nomenclatura. Você provavelmente quer ancorar a expressão regular. Algo como isso deve funcionar:

rename -n 's/^(\d{2})-(\d{2})-(\d{2})$/20$3-$2-$1/' *
    
por 15.06.2014 / 21:30
3

Eu seguiria o seguinte caminho:

for i in 'find . -name "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"'; do
  NEWNAME='echo $i | sed 's/\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)/20--/''
  echo $NEWNAME
done

Agora, quando estiver satisfeito com a saída, basta substituir "echo $ NEWNAME" por "mv $ i $ NEWNAME".

Claro, isso não é uma solução livre de erros, por exemplo, se houver um diretório chamado 30-05-14 e 2014-05-30, isso não renomearia o diretório atual, mas o moveria para 2014-05-30 /. Como você disse que trocou de esquema em algum momento, acho que isso não acontecerá (por exemplo, você não tem dir para determinada data em ambos os formatos).

Além disso, esta solução provavelmente não funcionará se você tiver espaços em seus nomes de diretório em algum lugar.

    
por 15.06.2014 / 21:25