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