website/addDateTaken.sh
2019-11-01 23:28:53 +01:00

286 lines
9 KiB
Bash
Executable file

#!/bin/sh
#todo: bei jeder Aenderung auch usage (doc) anpassen
#todo: translate entire script into english
# adds date taken in beginning of file name if jpg, .png, (not yet: .mp4, .mov, ...)
# Attention: there is a hard link to this script at the end!!! moving this script meens changing it
# options
# -h --help display help
# -a --noask --no-interactive do not prompt the user to confirm renaming
# -l --onlylog just logs what would have been done but not doing anything
# -o [file] --outputfile [file] specifies the output (log) file (standard is da.log)
# -v [file] --voutputfile [file] specifies the verbose output log file (standard dav.log)
# to be implemented in other sript:
# -i --image adds date taken in beginning of file name if jpg, .png, (not yet: .mp4, .mov, ...)
#Functions
vLog()
{
echo "$1" >> "$VLOGFILE"
}
log()
{
echo "$1" >> "$NVLOGFILE"
echo "$1" >> "$VLOGFILE"
}
rename()
# moves $1 to $2 if rn is 1, otherwise set variable new to $1
# log move on any case
{
log "rn \"$1\" to \"$2\""
if [ $rn -eq 1 ]
then
mv -- "$1" "$2"
else
new="$1"
fi
}
remove()
# deletes $1 if rn is 1, otherwise only logging
{
if test -f "$1"
then
#echo "$1"
log "rm \"$1\""
if test $rn -eq 1
then
trash "$1"
fi
fi
}
usage()
# displays help message and exit
{
echo ""
echo "help page for $0"
echo "---------------------------------"
echo "this script should not be called directly but by the Wrapper script WrapperAddDateTaken.sh"
echo "Usage: bash $0 [OPTIONS] DIR"
echo " $0 adds the date the picture was taken or movie was filmed at the beginning of the file name."
echo ""
echo "options"
echo " -h, --help display this help"
echo " -a, --noask --no-interactive do not prompt the user to confirm renaming (standard is asking for each file)"
echo " -l, --onlylog just logs what would have been done but not doing anything"
echo " -o [file], --outputfile [file] specifies the output (log) file (standard is da.log)"
echo " -v [file], --voutputfile [file] specifies the verbose output log file (standard dav.log)"
echo " -- finishes the list of options, next argument is taken as the dir"
#echo " -i, --image adds date taken in beginning of file name if jpg, .png, (not yet: .mp4, .mov, ...)"
echo ""
echo "error handling"
echo " if DIR is no valid directory, the scripts eith error code 1"
exit
}
folderloc()
# returns the argument as absolute path
# arg1: if arg1 starts with /, return arg1, otherwise return $(pwd)/arg1
{
case "$1" in
/* ) echo "$1"
break
;;
* ) echo "$(pwd)/$1"
break
;;
esac
}
# considering options
# saving all options to give them recursively
ops=""
# standard behavior: ask the user is file is to be renamed
# 0 meens not asking
ask=1
# standard behavior: actually rename
# 0 meens not renaming but just log what would have be done
rn=1
# standard behaviour: rename as usual
# 1 meens adding date taken to image and video files
# image=0
# the log file for verbose logging
#VLOGFILE="$1"
VLOGFILE="$(pwd)"/../rnv.log
# the log file for short logging
#NVLOGFILE="$2"
NVLOGFILE="$(pwd)"/../rn.log
#directory to be checked
dir="$(pwd)" # standard if not specified
# -n = string is non-zero length?
while test -n "$1" ; do
case $1 in
-h | --help ) usage;;
-o | --outputfile ) # ops="$ops -o ../$2"
shift
NVLOGFILE="$(folderloc "$1")"
;;
-v | --voutputfile ) #ops="$ops -v ../$2"
shift
VLOGFILE="$(folderloc "$1")"
;;
-a | --noask | --no-interactive ) ops="$ops -a"
ask=0
;;
-l | --onlylog ) ops="$ops -l"
rn=0
;;
-- ) shift
dir="$(folderloc "$1")"
break
;;
* ) dir="$(folderloc "$1")"
break
;;
esac
shift # must be done in any case: the next argument is $1
done
# echo "options"
# echo "asking=$ask"
# echo "rename=$rn"
# echo "log file=$NVLOGFILE"
# echo "verbose log file=$VLOGFILE"
# echo "direc=$dir"
#for testing purposes:
# exit
addDates()
# adds the picture taken dates to all pictures and descends into subfolders
{
for fil in *
do
if test -d "$fil"
then
cd "$fil"
addDates
cd ..
vLog "went back to $(pwd)"
continue
#vLog "handle dir"
# * als einziger Dateiname kommt auch bei leerem Ordner vor
fi
if test -e "$fil" # file to be moved exists
then
: # ok, do what comes after fi
else
continue
fi
case "$fil" in
201[0-9]_[01][0-9]_[0-3][0-9]*)
vLog "dont rename bc already date there: $fil";;
*.[jJ][pP][gG]|*.[jJ][pP][eE][gG]|*.[pP][nN][gG]) #|*.3gp|*.[aA][vV][iI])
date=$(exiftool -d "%Y_%m_%d_%H%M%S" -CreateDate "$fil" | awk '{print $4}')
# -z length is zero
if test -z "$date"
then
vLog "the file has no creation date: $fil"
else
# remove SAM_Zahl
new="$(echo "$fil" | sed 's/SAM_[0-9]\{4\}//')"
# remove DSC_Zahl (e.g. Hollys camera)
new="$(echo "$new" | sed 's/DSC_[0-9]\{4\}//')"
# remove DSCZaahl
new="$(echo "$new" | sed 's/DSC[0-9]\{5\}//')"
# remove DSCFZahl
new="$(echo "$new" | sed 's/DSCF[0-9]\{4\}//')"
# remove DSCIZahl
new="$(echo "$new" | sed 's/DSCI[0-9]\{4\}//')"
# remove DSCNZahl
new="$(echo "$new" | sed 's/DSCN[0-9]\{4\}//')"
# remove IMGPZahl (e.g. Romy Fischers camera)
new="$(echo "$new" | sed 's/IMGP[0-9]\{4\}//')"
#remove Zah-Zahl_IMG
new="$(echo "$new" | sed 's/[0-9]\{3\}-[0-9]\{4\}_IMG//')"
# remove IMG_Daaatuum_Zeeiit (e.g. my smartphone)
new="$(echo "$new" | sed 's/IMG_20[0-9]\{6\}_[0-9]\{6\}//')"
# remove IMG_Zahl
new="$(echo "$new" | sed 's/IMG_[0-9]\{4\}//')"
# remove PZaaaahl
new="$(echo "$new" | sed 's/P[0-9]\{7\}//')"
# remove PCZaaahl
new="$(echo "$new" | sed 's/P[ABC][0-9]\{6\}//')"
# remove PICTZahl
new="$(echo "$new" | sed 's/PICT[0-9]\{4\}//')"
# remove SDCZaahl
new="$(echo "$new" | sed 's/SDC[0-9]\{5\}//')"
# remove RIMGZahl
new="$(echo "$new" | sed 's/RIMG[0-9]\{4\}//')"
# remove Zaaaaaaaaahl_0Mbelieb--.Z (my smart phone at second bluetooth copy)
new="$(echo "$new" | sed 's/[0-9]\{14\}_0M.\{6\}\--\.[1-9]//')"
# remove 0beliebi--.Z (my smart phone)
new="$(echo "$new" | sed 's/0.\{7\}--\.[1-9]//')"
# remove 0CLxbelb--.Z (my smart phone)
new="$(echo "$new" | sed 's/0CLx.\{6\}--\.[1-9]//')"
# remove FotoZahl
new="$(echo "$new" | sed 's/Foto[0-9]\{4\}//')"
# hochzeitsbilder 180505_Za_Hochzeit (Z)
new="$(echo "$new" | sed 's/180505_[01][0-9]_Hochzeit ([0-9]*)/Hochzeit/')"
case "$new" in
_*|.*) ;; #tue nichts
*)
new="_$new";;
esac
new="$date$new" # date und _ haben keine Leerzeichen
# existiert eine Datei mit dem neuen Namen bereits?
# -e ist exist. die Datei schon?
# different jpeg extensions:
new="$(echo "$new" | sed 's/\.JPG/.jpg/g')"
new="$(echo "$new" | sed 's/\.JPEG/.jpg/g')"
new="$(echo "$new" | sed 's/\.jpeg/.jpg/g')"
if test -e "$new"
then
log "a file with name \"$new\" already exists, -> dont rename: $fil"
else
if test $ask -eq 0
then
rename "$fil" "$new"
else
# Abfrage ob man wirklich umbenennen will
echo "rename $fil to $new? enter, y, yes = yes"
read q
if test -z "$q" -o "$q" = "y" -o "$q" = "yes"
then
rename "$fil" "$new"
fi
fi
fi
fi
;;
*) vLog "dont rename bc no image: $fil"
esac
done
}
#actual script
# check if the argument is correct:
if test ! -d "$dir"
then
log "exiting bc there is no such dir as $dir"
#echo "exiting bc there is no such dir"
exit 1
fi
vLog "move to $dir"
cd "$dir"
addDates
# merke: in Bedingungsklammern [] von if muss am Anfang und am Ende ein " " (blank) stehen!!
# merke: Hinweise zu Bedingungen in if abrufbar unter "man test"
# merke: bei Zuweisungen mit = darf zwischen Variablenname und = kein Leerzweichen sein!
# (sonst wird Variablenname als command interpretiert)