#!/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, (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