Move fotos and videos from a device, i.e. cardreader or camera, and sort them by date into predefined folders.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
4.0 KiB

#!/bin/bash -e
## @id $Id$
## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
# configuration ##########################################################
prefix="@prefix@"
test -e "@sysconfdir@/mvfotos.conf" && . "@sysconfdir@/mvfotos.conf"
test -e ~/.mvfotos && . ~/.mvfotos
# end of configuration ###################################################
if test -z "${target}" -o ! -d "${target}"; then
echo "Please configure $1 in " 1>&2
echo "@sysconfdir@/mvfotos.conf or in ~/.mvfotos" 1>&2
exit -1
fi
cmd="mv -n"
test=no
globalprefix=
globaltype=
while [ $# -gt 0 ]; do
if [ "$1" == "-c" ]; then
cmd="cp -n"
elif [ "$1" == "--test" ]; then
test=yes
elif [ "$1" == "-t" ]; then
globaltype="$2"
shift
elif [ "$1" == "-p" ]; then
globalprefix="$2"
shift
elif [ "$1" == "-h" ]; then
echo "$0 [-p prefix] [-c] file [...]]"
echo
echo "OPTIONS"
echo " -p prefix specify name prefix"
echo " -c copy instead ov move"
echo " -t type overwrite file name extension"
echo " --test test only"
exit 0
else
postfix=$(basename "$1" | tr '[:upper:]' '[:lower:]' | sed 's,[/ ],_,g;s,[()\[\]{}],,g')
type=${globaltype:-${postfix##*.}}
date=
if [ "${exif//${type}/}" != "$exif" ]; then
date=$(exif -t 0x132 "$1" | sed -n 's/.*Value: \([0-9]*\):\([0-9]*\):\([0-9]*\) \([0-9]*\):\([0-9]*\):\([0-9]*\)/\1\2\3-\4\5\6/p' | uniq)
if [ -z "$date" ]; then
date=$(exif -t 0x9003 "$1" | sed -n 's/.*Value: \([0-9]*\):\([0-9]*\):\([0-9]*\) \([0-9]*\):\([0-9]*\):\([0-9]*\)/\1\2\3-\4\5\6/p' | uniq)
fi
if [ -z "$date" ]; then
date=$(exiftool -FileModifyDate "$1" | sed -n 's/.*File Modification Date\/Time.*: \([0-9]*\):\([0-9]*\):\([0-9]*\) \([0-9]*\):\([0-9]*\):\([0-9]*\)[^0-9]*.*/\1\2\3-\4\5\6/p' | uniq)
fi
fi
if [ -z "$date" ]; then
date=$(stat -c%y "$1" | sed 's/\(....\)-\(..\)-\(..\) \(..\):\(..\):\(..\).*/\1\2\3-\4\5\6/')
fi
if [ -z "$date" ]; then
echo "**** $0: CANNOT EVALUATE: $1" 1>&2
shift
break
fi
year=$(echo "$date" | sed 's/\(....\)....-.*/\1/')
month=$(echo "$date" | sed 's/....\(..\)..-.*/\1/')
day=$(echo "$date" | sed 's/......\(..\)-.*/\1/')
if [ "$month" -lt 3 -o "$month" -eq 3 -a "$day" -lt 21 ]; then
season=winter
elif [ "$month" -lt 6 -o "$month" -eq 6 -a "$day" -lt 21 ]; then
season=fruehling
elif [ "$month" -lt 9 -o "$month" -eq 9 -a "$day" -lt 21 ]; then
season=sommer
elif [ "$month" -lt 12 -o "$month" -eq 12 -a "$day" -lt 21 ]; then
season=herbst
else
season=jahresende
fi
found=no
for ((i=1; i<=$num; ++i)); do
if [ "${ext[$i]//$type/}" != "${ext[$i]}" ]; then
found=yes
break
fi
done
if [ $found = "no" ]; then
echo "**** $0: UNKNOWN FYLE TYPE ($type): $1" 1>&2
shift
break
fi
path="${target}/${path[$i]}/${year}/${year}_${season}"
if test -z "$globalprefix"; then
prefix=${prefix[$i]}
else
prefix=${globalprefix}
fi
test -d "path" || mkdir -p "$path"
echo "$cmd $1 ${path}/${date}-${prefix}-${postfix}"
if test -e "${path}/${date}-${prefix}-${postfix}"; then
echo "WARNING: target already exists, ignored"
else
if test "$test" != "yes"; then
$cmd "$1" "${path}/${date}-${prefix}-${postfix}"
if which exiftran > /dev/null; then
if [ "${exif//${type}/}" != "$exif" ]; then
echo "exiftran -aip ${path}/${date}-${prefix}-${postfix}"
exiftran -aip "${path}/${date}-${prefix}-${postfix}"
fi
fi
fi
fi
clipinf="${1/STREAM/CLIPINF}"
clipinf="${clipinf%.*}.CPI"
if test -f "$clipinf"; then
path="${target}/${path[$cpi]}/${year}/${year}_${season}"
echo "$cmd $clipinf ${path}/${date}-${prefix}-${postfix%.*}.cpi"
if test -e "${path}/${date}-${prefix}-${postfix%.*}.cpi"; then
echo "WARNING: target already exists, ignored"
else
if test "$test" != "yes"; then
test -d "path" || mkdir -p "$path"
$cmd "$clipinf" "${path}/${date}-${prefix}-${postfix%.*}".cpi
fi
fi
fi
fi
shift
done