En otra entrada presenté un script para PowerShell (Windows) que utilizaba la librería Imagemagick para filtrar falsos positivos de imágenes recuperadas con Foremost (Usos de ImageMagick: filtrar falsos positivos de imágenes recuperadas con Foremost). En esta ocasión, presento un shell-script para LINUX que realiza la misma tarea con un añadido interesante: clasificar las imágenes recuperadas por el modelo de cámara utilizado para realizar la fotografía.
El caso concreto fue así: un «presunto delincuente sospechoso de realizar e intercambiar fotografías delictivas» atesoraba en varios discos duros cientos de miles de fotografías. Este gran número de fotografías se multiplicó al analizar las imágenes de los discos duros y recuperar los archivos JPG que habían sido borrados previamente. La investigación requería localizar las imágenes producidas por el sospechoso, las fotos que había realizado este «individuo».
Con el script adjunto, se procesaron todas las imágenes que se habían almacenado en un directorio y se movieron las mismas a diferentes subdirectorios:
- NO-VALIDO: donde se guardan los archivos que no corresponden a imágenes válidas (falsos positivos, ficheros incompletos, corruptos, etc.)
- NO-MODELO : donde se guardan las imágenes que no tienen identificado un modelo de cámara (no aparece el campo EXIF:Model)
- EXIF:Model: por cada valor diferente de este campo se crea un subdirectorio y se guardan dentro las imágenes correspondientes
De esta manera, resultó fácil descartar los falsos positivos y localizar las imágenes tomadas con la cámara de fotos del individuo cuyo modelo conocíamos.
Es fácil adaptar el script para filtrar por resolución, fecha de la fotografía, ubicación GPS, etc.
#!/bin/bash
# Script: classify-by-model.sh
# Autor: javier tobal (@javitobal)
# usage classify-by-model <input-directory> <output-directory>
echo classify-by-model [+]
echo usage: clasify-by-model [input-directory] [output-directory]
INPUT="$1"
OUTPUT="$2"
# variables estáticas
NOMODELOSUBDIR=NO-MODELO
NOVALIDOSUBDIR=NO-VALIDO
#por defecto, el directorio actual
[ "INPUT" == "" ] && DIR="."
[ "OUTPUT" == "" ] && DIR="."
echo INPUT: $INPUT
echo OUTPUT: $OUTPUT
for file in $INPUT/*
do
echo Procesando: $file
MODELO=$(/usr/bin/identify -format \"%[EXIF:Model]\" "$file" 2>/dev/null)
RET_CODE=$?
if [ $RET_CODE = 0 ]; then
if [ ${#MODELO} = 2 ]; then
# Usamos una etiqueta para las imágenes sin modelo de cámara
MODELOSUBDIR=$NOMODELOSUBDIR
else
# Quitamos las comillas a la cadena devuelta
MODELOSUBDIR=${MODELO:1:${#MODELO}-2}
fi
else
# Los ficheros que no son imágenes válidas se guardan en otro subdir
MODELOSUBDIR=$NOVALIDOSUBDIR
fi
# ahora movemos el archivo al sitio correspondiente
# creamos el subdir si no existe
mkdir -p "$OUTPUT/$MODELOSUBDIR"
mv "$file" "$OUTPUT/$MODELOSUBDIR"
done
# end of script
echo classify-by-model [-]