Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
|
triphoto [2020/07/07 10:17] behemoth créée |
triphoto [2020/09/07 20:26] (Version actuelle) behemoth [Présentation] |
||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== Tri de photos automatique par dossiers ANNEE/ | ====== Tri de photos automatique par dossiers ANNEE/ | ||
| ===== Présentation ===== | ===== Présentation ===== | ||
| - | Ce script permet de trier automatiquement les photos d'un dossier en les classant dans différents dossiers selon l' | + | Ce script |
| - | Il se base sur les données EXIF des photos | + | Il se base sur les données EXIF des photos |
| - | ==== Pré-requis ==== | + | ===== Pré-requis |
| - | * avoir le paquet exiftool installé : | + | * avoir le paquet |
| + | |||
| + | ===== Utilisation ===== | ||
| + | * Copier le script dans le dossier à trier | ||
| + | * En ligne de commande, lancer le script | ||
| + | |||
| + | ===== Script ===== | ||
| + | <code bash> | ||
| + | #! /bin/bash | ||
| + | # This script is used to sort photos. It uses the EXIFTOOL to | ||
| + | # 1st attempt to extract the photo' | ||
| + | # invalid, then the file name is checked to see if it begins | ||
| + | # with " | ||
| + | # prior two checks fail, then the photo' | ||
| + | # used but can be inaccurate. | ||
| + | # If a valid creation date is found and the file name is NOT | ||
| + | # date-encoded, | ||
| + | # prefix. | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | |||
| + | DEBUG=0 | ||
| + | DRYRUN=0 | ||
| + | NOTE="" | ||
| + | |||
| + | # ANSI COLORS | ||
| + | CRE=" | ||
| + | RED=" | ||
| + | GRN=" | ||
| + | YEL=" | ||
| + | BLU=" | ||
| + | MAG=" | ||
| + | CYN=" | ||
| + | WHT=" | ||
| + | NML=" | ||
| + | |||
| + | # | ||
| + | # Functions | ||
| + | # | ||
| + | # Enter with: YEAR, MONTH and DAY | ||
| + | # Returns: 0=invalid date, 1=valid date | ||
| + | # EX: IsValidDate $YEAR $MONTH $DAY | ||
| + | IsValidDate() { | ||
| + | #echo "Parm: Y=$1,${#1} M=$2,${#2} D=$3, | ||
| + | if ([ " | ||
| + | ([ " | ||
| + | ([ " | ||
| + | echo " | ||
| + | else | ||
| + | echo " | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # Dump debugging info | ||
| + | # EX: $(DumpDebug $FN $FILE $EXT $FN_WD $DATE $YEAR $MONTH $DAY " | ||
| + | DumpDebug() { | ||
| + | #echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | } | ||
| + | |||
| + | # | ||
| + | # Script starts here | ||
| + | # | ||
| + | # Use exiftool to find video and photos | ||
| + | #exiftool -filename *.[JjGg][PpIi][GgFf] *.[Jj][Pp][Ee][Gg] *.[Mm][PpOo][Gg4Vv] 2>/ | ||
| + | find . -maxdepth 1 -type f -iname " | ||
| + | -iname " | ||
| + | -iname " | ||
| + | while read FN ; do | ||
| + | FN=$(basename $FN) # strip the leading " | ||
| + | if [ -e $FN ] && [ ${#FN} != 0 ] ; then # be sure the file exists! | ||
| + | EXT=${FN## | ||
| + | FILE=${FN%.*} | ||
| + | |||
| + | # First attempt to see if there is a valid date prefix in the file name. | ||
| + | YEAR=$(echo ${FN:0:4} | egrep -E ^[0-9]+$ ) # insure digits only | ||
| + | MONTH=$(echo ${FN:4:2} | egrep -E ^[0-9]+$ ) # insure digits only | ||
| + | DAY=$(echo ${FN:6:2} | egrep -E ^[0-9]+$ ) # insure digits only | ||
| + | DATE=" | ||
| + | # Check the filename' | ||
| + | # and that the date falls within the proper range | ||
| + | if ([ ! -z " | ||
| + | [ $(IsValidDate $YEAR $MONTH $DAY) == 1 ] ; then | ||
| + | if [ $DEBUG == 1 ] ; then echo " | ||
| + | FN_WD=0 | ||
| + | else | ||
| + | FN_WD=1 | ||
| + | fi | ||
| + | |||
| + | # Next, attempt to find an EXIF CreateDate from the file, if it exists. | ||
| + | DATE=$(exiftool -s -f -CreateDate $FN | awk ' | ||
| + | # Perform sanity check on correctly extracted EXIF CreateDate | ||
| + | if [ " | ||
| + | # Good date extracted, so extract the year, month and day | ||
| + | # of month from the EXIF info | ||
| + | echo "A valid ${WHT}CreateDate${NML} was found, using it." | ||
| + | YEAR=${DATE: | ||
| + | MONTH=${DATE: | ||
| + | DAY=${DATE: | ||
| + | NOTE=" | ||
| + | |||
| + | else | ||
| + | # EXIF CreateDate invalid or not found, so attempt to derive the | ||
| + | # date from the file name. | ||
| + | YEAR=$(echo ${FN:0:4} | egrep -E ^[0-9]+$ ) # insure digits only | ||
| + | MONTH=$(echo ${FN:4:2} | egrep -E ^[0-9]+$ ) # insure digits only | ||
| + | DAY=$(echo ${FN:6:2} | egrep -E ^[0-9]+$ ) # insure digits only | ||
| + | DATE=" | ||
| + | |||
| + | # check the extracted date from filename for validity (not NULL strings) | ||
| + | # and that the date falls within the proper range | ||
| + | #if [ -z " | ||
| + | if ([ ! -z " | ||
| + | [ $(IsValidDate $YEAR $MONTH $DAY) == 1 ] ; then | ||
| + | echo "A valid ${WHT}FileNameDate${NML} was found, using it." | ||
| + | NOTE=" | ||
| + | |||
| + | else | ||
| + | # EXIF CreateDate and FileNameDate extraction failed, so attempt | ||
| + | # to extract the EXIF FileModifyDate from the file, if it exists. | ||
| + | DATE=$(exiftool -s -f -FileModifyDate $FN | awk ' | ||
| + | # Perform sanity check on correctly extracted EXIF FileModifyDate | ||
| + | if [ " | ||
| + | # Good FileModifyDate found, extract the year, month and | ||
| + | # day of month from the EXIF info | ||
| + | echo "A valid EXIF CreateDate and FileNameDate were not found!" | ||
| + | echo " The innacurate ${WHT}FileModifyDate${NML} will be used." | ||
| + | YEAR=${DATE: | ||
| + | MONTH=${DATE: | ||
| + | DAY=${DATE: | ||
| + | NOTE=" | ||
| + | FN_WD=0 | ||
| + | else | ||
| + | echo " | ||
| + | if [ $DEBUG == 1 ] ; then | ||
| + | echo " | ||
| + | fi | ||
| + | echo " | ||
| + | echo | ||
| + | fi | ||
| + | fi | ||
| + | fi | ||
| + | |||
| + | # Modify the filename if a valid EXIF CreateDate or FileNameDate was found. | ||
| + | if [ $FN_WD == 0 ] ; then | ||
| + | FILE=${FILE}.${EXT} | ||
| + | else | ||
| + | FILE=${YEAR}${MONTH}${DAY}-${FILE}.${EXT} | ||
| + | fi | ||
| + | |||
| + | # Debug output | ||
| + | if [ $DEBUG == 1 ] ; then DumpDebug $FN $FILE $EXT $FN_WD $DATE $YEAR $MONTH $DAY " | ||
| + | |||
| + | # We have a date, hopefully a good one, move the file | ||
| + | if [ $DRYRUN == 0 ] ; then | ||
| + | # create the directory structure. Pipe errors to NULL | ||
| + | mkdir -p $YEAR/ | ||
| + | # move the file to the appropriate directory | ||
| + | echo " -> Moving $FN to $YEAR/ | ||
| + | mv $FN $YEAR/ | ||
| + | echo | ||
| + | else | ||
| + | echo " | ||
| + | echo | ||
| + | fi | ||
| + | # Clear the variables | ||
| + | FN=""; | ||
| + | else | ||
| + | echo | ||
| + | echo "File $FN not found!" | ||
| + | echo | ||
| + | fi | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | ===== Source ===== | ||
| + | [[https:// | ||