Törmäsin tuossa kerran ongelmaan, koneella pari sataa digikuvaa eikä ollut mitään tietoa milloin mikäkin oli otettu. Ja kaiken lisäksi vielä usealla erimerkkisellä kameralla otettuja kuvia.
Kun rupesin asiaa selvittämään huomasin, että digikamera tallentaa kuvien mukaan EXIF-tagin josta näkee milloin kuvat on otettu. Niinpä tein perl-skriptin joka nimeää nuo kuvat päivämäärän mukaiseen järjestykseen. Ajattelin laittaa skriptin tännekkin, jos siitä olisi jollekkin muullekkin hyötyä.
Skripti tarvitsee toimiakseen perl-base ja universestä löytyvän exif paketit.
#!/usr/bin/perl
# Digikuvien nimeäminen EXIF tiedon päivämäärän mukaan.
#
# 2005 LittleLion
# Lisence http://www.gnu.org/licenses/gpl.txt
$movefolders=1; # Siirretäänkö tiedostot päivämäärän mukaisiin kansioihin
$images="*.JPG *.JPEG *.jpg *.jpeg"; # Etsittävät tiedostotyypit (huomaa kirjainkoko)
$imgfolder="images"; # Kansio josta kuvat löytyvät
#### Varsinainen koodi alkaa #####
@names=`exif $imgfolder/$images`;
@files=`cd $imgfolder && ls $images 2> /dev/null`;
$y=0;
# Luetaan rivit taulukosta
for ($i=0; $i < @names.''; $i++) {
# Etsitään rivi josta löytyy kellon aika tiedot
if ($names[$i] =~ s/^Date and Time \(origi\|//) {
$names[$i] =~ s/ /:/;
$names[$i] =~ s/ //g;
$names[$i] =~ s/\n//;
# Pätkitään päivämäärä ja kello aika osiin.
@fields = split /:/, $names[$i];
# Kootaan tiedostonimi
# field muuttujan rakenne:
# 0 1 2 3 4 5
# vuosi kuukausi päivä tunti minuutti sekuntti
$filenames[$y] = "$fields[0]-$fields[1]-$fields[2]_$fields[3]-$fields[4]-$fields[5].jpg\n"; # Tiedostojen nimeäminen
$day[$y] = "$fields[0]-$fields[1]-$fields[2]"; # Kansioiden nimeäminen
$y++;
}
}
if (@filenames.'' != @files.'') {
print "Päivämäärien ja tiedostojen määrä ei täsmää. Lopetetaan...\n";
exit 1;
}
chdir $imgfolder;
for ($i=0; $i < @filenames.''; $i++) {
$files[$i] =~ s/\n//;
if ($movefolders == 1) {
mkdir $day[$i] || die "Kansiota ei voitu luoda";
`mv $files[$i] $day[$i]/$filenames[$i]`; # Nimetään tiedostot uudelleen ja siirretään ne kansioihinsa :D
}
else {
`mv $files[$i] $filenames[$i]`; # Nimetään tiedostot uudelleen :D
}
}
Kommentteja ja parannusehdotuksia otetaan vastaan. Toivottavasti jollekkin on tästä hyötyä.
EDIT: Lisätty mahdollisuus päivämäärien mukaiseen kansiointiin.
EDIT2:
Tiedossa olevat bugit:
1. Jos kuva kansiossa on kuvia, joissa ei ole EXIF-tagia tulee erroria.
2. Jos kuva kansiossa on useita kuvia, jotka on otettu samana päivänä sekunnilleen samaan aikaan ne häviävät tämän skriptin ajettaessa. (esim kopiot samasta kuvasta tai alkuperäinen ja muokattu versio samasta kuvasta) Kansioon jää kuva joka on aakkosjärjestyksessä jälkimmäisenä.