El Dimarts 28 Juny 2005 18:31, Albert Que va escriure:
> Ho puc fer amb windows sense instal·lar cap programa? si no és el cas,
> quin programa  lliure va bé per fer-ho? Com ho podria fer amb linux sinó?

Amb un scriptillo en Bash, of course :)

Primer explico les passes a mà.  Al final, es posen totes en un arxiu que es 
guarda i se li dona permisos d'execució, i tal dia farà un any: tens el 
programa per usar-lo quan vulguis.

1)

Tenim el comandament jhead (i si no apt-get install jhead).  Treu les 
capçaleres exif de cada foto.

$ jhead IMG_4866.JPG
File name    : IMG_4866.JPG
File size    : 702720 bytes
File date    : 2005:06:28 19:53:10
Camera make  : Canon
Camera model : Canon DIGITAL IXUS 330
Date/Time    : 2005:05:29 15:50:03
Resolution   : 1600 x 1200
Flash used   : No
Focal length :  5.4mm  (35mm equivalent: 37mm)
CCD width    : 5.23mm
Exposure time: 0.0031 s  (1/320)
Aperture     : f/8.0
Metering Mode: matrix
Jpeg process : Baseline

2)

De la informació del jhead només ens interessa la línia que treu la data.  Per 
això va fantàstic el comandament grep al que li redireccionam la sortida amb 
un | i posam la opció -i per evitar distinguir majúscules de minúscules:

$ jhead IMG_4866.JPG | grep -i date/time
Date/Time    : 2005:05:29 15:50:03

Beníssim, fa bonda :)

3)

Només volem la data, i per aquestes coses va bé el awk, un llenguatge de 
programació simple per tractar textos.  Li direm que volem la columna 3 (la 1 
és el rètol, la 2 són els : i la 3 és la data):

$ jhead IMG_4866.JPG | grep -i date/time | awk '{print $3 }'
2005:05:29

Ho fa, faltaria més! ;))

4)

Ja tenim la data en que es va fer cada foto.  Ara caldria llevar-li els 2 
punts perquè fos 20050529 en comptes de 2005:05:29.   Per aquestes coses hi 
ha ordres Bash de manipulacions de cadenes no gaire complicades, encara que 
críptiques a simple vista.  Aquí la primera explicació que he trobat amb 
Google: http://www.digitwebsites.net/BashScripting/string-manipulation.html

5)

Aquí l'script sencer:


#!/bin/sh
for FOTO in *.{jpg,JPG} ; do
     DATA=`jhead $FOTO | grep -i date/time | awk '{print $3 }'`
     DATA=${DATA:0:4}${DATA:5:2}${DATA:8:2}
     FOTOV=$FOTO
     FOTO=${FOTO/"-"$DATA/}
     NOMNOU=${FOTO:0:3}"-"$DATA"_"${FOTO:4}
     printf " Arxiu: %s\tData: %s\tNom nou: %s\n" $FOTOV $DATA $NOMNOU
     # mv $FOTOV $NOMNOU
done

Objectiu: l'arxiu IMG_4866.JPG es dirà IMG-20050529_4866.JPG  Afegeixo el 
-20050529 (amb el guió, important com es veu a continuació)

6) Explicat devall cada retxa:


#!/bin/sh
(es crida el bash per executar-lo)
for FOTO in *.{jpg,JPG} ; do
("per cada arxiu que es digui jpg o JPG em carregues el nom dins FOTO i fas 
tot el que hi ha devall fins done")
     DATA=`jhead $FOTO | grep -i date/time | awk '{print $3 }'`
     (l'ordre explicada en els passos 1 a 3 que es carrega dins la variable 
DATA)
     DATA=${DATA:0:4}${DATA:5:2}${DATA:8:2}
     (llevo els : a la data)
     FOTOV=$FOTO
     (guardo el nom original de l'arxiu abans de tocar-lo, ens farà falta per 
l'ordre de renomenamenta)
     FOTO=${FOTO/"-"$DATA/}
     (precaució: si el nom de l'arxiu ja té un guio i la data, el llevo o 
s'aniria allargant cada cop que s'executés l'escript!)
     NOMNOU=${FOTO:0:3}"-"$DATA"_"${FOTO:4}
     (composició del nom nou: les primeres tres lletres de l'original (IMG), 
un guió, la data, i des de la lletra 4 de l'original fins al final))
     printf " Arxiu: %s\tData: %s\tNom nou: %s\n" $FOTOV $DATA $NOMNOU
     (ho escric en pantalla, per anar dient coses del que faig, proves)
     # mv $FOTOV $NOMNOU
     (fa la renomenamenta, però no perquè la línia està comentada. Així es pot 
provar com queden els noms abans d'executar-lo.  Perquè renomeni, cal llevar 
el #)
done
(tanca el bucle for)




-- 
Benjamí
http://weblog.bitassa.net



.

_______________________________________________
llista de correu de l'Internauta
[email protected]
http://zeus.internauta.net/mailman/listinfo/internauta

Respondre per correu electrònic a