Script jpgtime

Description

jpgtime a pour but de remplacer la date de dernière modification (qui s'affiche dans les navigateurs de fichiers) des images de type JPEG par la date de la prise de vue, stockée dans les données EXIF de la photographie.

Téléchargement

Télécharger jpgtime

jpgtime est distribué sous licence libre CeCILL.

Installation

Une fois le fichier téléchargé, vous devez

Ce logiciel nécessite l'utilisation de l'utilitaire identify installable sous Ubuntu ou Debian par

sudo aptitude install imagemagick

Aide en ligne

$ jpgtime -h

Usage : jpgtime [-nvw] [répertoire|fichier ...]
        jpgtime -h

Modifie le temps de dernière modification des fichiers de type JPEG donnés en
argument ou contenus dans des répertoires, en fonction de leurs données EXIF.

La recherche des fichiers dans les répertoires est récursive. Seuls les fichiers
de type JPEG sont vérifiés. Sans argument, le répertoire courant est utilisé.
Sans les options -q ou -v, seuls les noms des répertoires et les décomptes de
fichiers à modifier sont affichés.

Options :
 -h : afficher cette aide
 -n : mode sans écriture ('dry-run'), liste seulement les actions à effectuer
 -q : mode silencieux, aucune sortie
 -v : mode verbeux complet, affiche la liste de tous les fichiers concernés

Transcript

#!/bin/bash

# This software is governed by the CeCILL license under French law and
# abiding by the rules of distribution of free software.  You can  use, 
# modify and/ or redistribute the software under the terms of the CeCILL
# license as circulated by CEA, CNRS and INRIA at the following URL
# "http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt".
# 
# Ce logiciel est régi par la licence CeCILL soumise au droit français et
# respectant les principes de diffusion des logiciels libres. Vous pouvez
# utiliser, modifier et/ou redistribuer ce programme sous les conditions
# de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA 
# à l'adresse "http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt".
# 
# Copyright Cyril Ravat, <ravat@free.fr> (2009-11)
# Website : http://www.cyril-ravat.fr/scripts/jpgtime.php
# Help : jpgtime -h

# Options par défaut
# Mode sans action
DRYRUN=
# Mode verbeux
VERBOSE=1

# Options du script
while getopts ":hnqv" option
do
  case $option in
    "h")
      echo -e "Usage : $(basename "$0") [-nvw] [\033[1mrépertoire\033[0m|\033[1mfichier\033[0m ...]"
      echo "        $(basename "$0") -h"
      echo
      echo -e "Modifie le temps de dernière modification des \033[1mfichier\033[0ms de type JPEG donnés en"
      echo -e "argument ou contenus dans des \033[1mrépertoire\033[0ms, en fonction de leurs données EXIF."
      echo 
      echo -e "La recherche des fichiers dans les \033[1mrépertoire\033[0ms est récursive. Seuls les fichiers"
      echo "de type JPEG sont vérifiés. Sans argument, le répertoire courant est utilisé."
      echo -e "Sans les options \033[1m-q\033[0m ou \033[1m-v\033[0m, seuls les noms des répertoires et les décomptes de"
      echo "fichiers à modifier sont affichés."
      echo
      echo "Options :"
      echo -e " \033[1m-h\033[0m : afficher cette aide"
      echo -e " \033[1m-n\033[0m : mode sans écriture ('dry-run'), liste seulement les actions à effectuer"
      echo -e " \033[1m-q\033[0m : mode silencieux, aucune sortie"
      echo -e " \033[1m-v\033[0m : mode verbeux complet, affiche la liste de tous les fichiers concernés"
      echo 
      exit 0
    ;;
    "n")   DRYRUN=1  ; OPTS="${OPTS}n" ;;
    "q")   VERBOSE=0 ; OPTS="${OPTS}q" ;;
    "v")   VERBOSE=2 ; OPTS="${OPTS}v" ;;
    "?")   break     ;;
  esac 
done
shift $((OPTIND-1))
[ -n "$OPTS" ] && OPTS="-$OPTS"

# Vérification de l'utilitaire imagemagick
if [ -z `which identify` ]; then
  echo -e "L'utilitaire \033[1midentify\033[0m n'existe pas."
  echo -e "Il faut installer le paquet \033[1mimagemagick\033[0m."
  exit 1
fi

# Si pas d'argument
[ $# -eq 0 ] && $0 $OPTS . && exit

function time_touch() {
  for FICHIER in "$@"; do
    
    # Vérification de l'extension : on n'accepte que les extensions autorisées
    EXT=`echo "${FICHIER##*.}" | tr [:upper:] [:lower:]`
    [ "$EXT" != "jpg" ] && [ "$EXT" != "jpeg" ] && continue

    # Temps
    # ATTENTION : ne fonctionne pas avec la version 6.3.7 d'Imagemagick
    TIME1=`identify -format "%[EXIF:DateTimeOriginal]" "$FICHIER" 2>/dev/null`
    [ -z "$TIME1" ] && TIME1=`identify -format "%[EXIF:DateTime]" "$FICHIER" 2>/dev/null`
    # Work around pour la version 6.3.7 d'Imagemagick (jusqu'à Ubuntu Intrepid par exemple)
    [ -z "$TIME1" ] && TIME1=`identify -format "%[exif:*]" "$FICHIER" 2>/dev/null | sed -n "/DateTimeOriginal=/s/exif:DateTimeOriginal=//p"`
    [ -z "$TIME1" ] && TIME1=`identify -format "%[exif:*]" "$FICHIER" 2>/dev/null | sed -n "/DateTime=/s/exif:DateTime=//p"`
    TIME2=`/bin/ls --full-time "$FICHIER" | tr '-' ':' | sed "s/.*\([0-9: ]\{19\}\).*/\1/"`
    # Le fichier est concerné
    if [ -n "$TIME1" ] && [ "${TIME1}" != "${TIME2}" ] ; then
      TIME1=`echo "${TIME1:0:16}.${TIME1:17}" | tr -d ': '`
      [ $VERBOSE -ge 1 ] && (( N+=1 ))
      [ $VERBOSE = 2 ] && echo -e " Fichier \033[1m$FICHIER\033[0m"
      [ $DRYRUN ] || touch -m -t "$TIME1" "$FICHIER" 2>&1
    else
      [ $VERBOSE -ge 1 ] && (( M+=1 ))
    fi

  done
}

# Boucle principale
for i in "$@"; do

  # Traitement des répertoires
  if [ -d "$i" ]; then
    N=0
    M=0
    [ $VERBOSE = 2 ] && echo -e "Répertoire \033[1m$i\033[0m"
    for FICHIER in "${i%/}"/*; do
      [ -d "$FICHIER" ] && $0 $OPTS "$FICHIER" || time_touch "$FICHIER"
    done
    [ $VERBOSE -ge 1 ] && (( M+=$N )) && echo -e "Répertoire \033[1m$i\033[0m ($N fichiers concernés sur $M)"
  
  # Traitement des images
  else
    time_touch "$i"
  fi
done