sábado, 15 de outubro de 2005

Ruby - A primeira script

Tenho um problema! Recentemente cheguei de férias (não, não é esse o problema ;) Apesar de já ter terminado, existem as sempre obrigatórias fotografias para mais tarde recordar com os amigos. Juntei numa directoria as fotos da minha máquina com a do meu primo. Quando as começamos a visualizar, para nosso espanto, a sequencia mostrava que estavamos em duas cidades em simultaneo! Verificamos o nome dos ficheiros e apercebemonos imediatamente que as datas estavam mal. Descobrimos que todas as fotos tiradas pela minha máquina estava com o calendário atrasado 3 dias.

Renomear "à mão" os 407 ficheiros, está fora de questão!

Está aqui a tarefa ideal para aplicar o que já aprendi da linguagem Ruby. Demorei umas 4 horas a ler e a praticar alguns exercícios do tutorial do livro. Com base nisso cheguei a este pequeno programa. O que faz é renomear os ficheiros seguindo o padrão yyyy-MM-dd hh-mm-ss xxxx.jpg, mas adicionando 3 dias a data. Em um segundo tinha o problema resolvido.

Nos proximos dias vou entreter-me melhorar isto. Um problema que tem (aka bug), é o que acontece se o dia for 31. A script ainda não tem a noção de datas, só de nomes de ficheiros, logo os ficheiros seria renomeados de "2005-09-30*.jpg" para "2005-09-33*.jpg" e não para o mês seguinte "2005-10-03*.jpg".

 1 puts Dir.pwd
 2 
 3 Dir.glob("*.{jpg,JPG}") do
 4   |filename|
 5   data, hora, index = filename.split(/\s+/)
 6   puts "Data:" + data
 7   
 8   ano, mes, dia = data.scan(/\d+/)
 9   
10   # I don't know why "03" is diferente of just "0"
11   # If I don't take out the leading zero, 
12   # I have conversion error
13   if dia.index('0') == 0
14     puts "Initial zero detected"
15     dia = dia[1,dia.length]
16   end
17   
18   dia_ajustado = Integer(dia) + 3
19   str_dia_ajustado = dia_ajustado.to_s  
20   
21   # put back the leading zero if necessary
22   if str_dia_ajustado.length == 1
23     str_dia_ajustado = "0" + str_dia_ajustado
24   end
25   puts "Dia Ajustado: #{str_dia_ajustado}"
26 
27   newfilename = ano + "-" + mes + "-" + str_dia_ajustado + " " + hora + " " + index
28   puts newfilename
29   
30   puts "Renamed file #{filename} to #{newfilename}"
31   File.rename(filename, newfilename)
32 
33 end