Fullmenu null

 

12 August 2018

Tengo una cámara nueva que hace unas fotos realmente fantásticas. Incluso puedo conectar mi teléfono y transferirme las fotos a este para compartirlas al momento. Sin embargo lo que no hace (o yo no he encontrado) es organizarme las fotos por carpetas según la fecha en que la tomé.

Con este pequeño script vamos a poder acceder a la información EXIF que se guarda dentro de la imagen para buscar la fecha en que fue tomada y usarla para organizar todas las fotos de un directorio dado.

@Grab("org.yaml:snakeyaml:1.16")
@Grab("com.drewnoakes:metadata-extractor:2.11.0")

import static groovy.io.FileType.FILES

import com.drew.metadata.*
import com.drew.imaging.*
import com.drew.imaging.jpeg.*
import com.drew.metadata.exif.*

dir = new File(args[0])

outdir = new File(args[1])
outdir.mkdirs()

files = []
dir.traverse(type: FILES, maxDepth: 0) { files << it }
files = files.findAll{ file ->
	String ext = file.name.toLowerCase().split("\\.").last()
	['jpg','png'].contains(ext)
}.sort{ it.lastModified() }

if( !files.size() ){
	println "No files"
	return
}

files.each{ file ->
	String gname = new Date(file.lastModified()).format('yyyy-MM-dd')

	try {
            Metadata metadata = ImageMetadataReader.readMetadata(file)
            metadata.directories.find{ it.name=="Exif IFD0"}.tags.findAll{
			it.tagName =="Date/Time"}.each{ tag ->
		gname = tag.description[0..10].replaceAll(":","-")
	    }
	}catch( e ){
	    println "error extracting metadata for $file.name : $e.message"
	}

	File newdir = new File(outdir,gname)
	newdir.mkdirs()
println "Move $file.name to $newdir.name"
	file.renameTo( new File(newdir, file.name)  )
}

El script es muy simple:

Dado un directorio de origen y uno de destino, recorrerá todos los ficheros .jpg y .png del primero y para cada uno de ellos extraerá la información meta que contiene. Esta información es muy extensa y cada fabricante añade las suyas propias. De todas ellas buscaremos el tag EXIF Date/Time el cual es usado para guardar la fecha en que se tomó la foto.

Simplemente usaremos este tag como nombre del subdirectorio donde mover la foto.


Script
@Grab("org.yaml:snakeyaml:1.16")
@Grab("com.drewnoakes:metadata-extractor:2.11.0")

import static groovy.io.FileType.FILES

import com.drew.metadata.*
import com.drew.imaging.*
import com.drew.imaging.jpeg.*
import com.drew.metadata.exif.*

dir = new File(args[0])

outdir = new File(args[1])
outdir.mkdirs()

files = []
dir.traverse(type: FILES, maxDepth: 0) { files << it }
files = files.findAll{ file ->
	String ext = file.name.toLowerCase().split("\\.").last()
	['jpg','png'].contains(ext)
}.sort{ it.lastModified() }

if( !files.size() ){
	println "No files"
	return
}

files.each{ file ->
	String gname = new Date(file.lastModified()).format('yyyy-MM-dd')

	try {
            Metadata metadata = ImageMetadataReader.readMetadata(file)
            metadata.directories.find{ it.name=="Exif IFD0"}.tags.findAll{
			it.tagName =="Date/Time"}.each{ tag ->
		gname = tag.description[0..10].replaceAll(":","-")
	    }
	}catch( e ){
	    println "error extracting metadata for $file.name : $e.message"
	}

	File newdir = new File(outdir,gname)
	newdir.mkdirs()
println "Move $file.name to $newdir.name"
	file.renameTo( new File(newdir, file.name)  )
}