#!/bin/bash ( # ANFANG set -e verwendung() { echo 'copyPhotos [-i]' echo ' -d übergehe Kopieren zum Drittbackup' echo ' -f übergehe Kopieren zum Fileserver' echo ' -i übergehe bereits vorhandene Dateien ohne zu meckern' echo ' -z übergehe Kopieren zum Zweitbackup' exit 1 } zielVerzeichnis="/home/erich/Bilder" endHost="fileserver" endZielVerzeichnis="Bilder/Fotos" zweitHost='nlopc43' zweitZielVerzeichnis='/tmp/mount.dc3b07aa-52e5-4dab-9cd6-9354c116e94c/Bilder/Fotos' drittHost='data@backup' drittZielVerzeichnis='raid/Bilder/Fotos' publicHost="ecknernet@eckner.net:backstage/downloadarea" unset daten unset jahre declare -A daten declare -A jahre backup=true fileserver=true ignoriere=false stefanie=true eval set -- "$( getopt -o dfiz -n "$(basename "$0")" -- "$@" || \ echo verwendung )" while true do case "$1" in -d) backup=false ;; -f) fileserver=false ;; -i) ignoriere=true ;; -z) stefanie=false ;; --) shift break ;; *) echo 'FEHLER: Ich verstehe Parameter "'"$1"'" nicht.' verwendung ;; esac shift done if [ $# -ne 0 ] then echo 'FEHLER: überflüssiger Parameter "'"$1"'".' verwendung fi for quelle in $(find /mnt/usb/ -type f \( -iname "*.jpg" -o -iname "*.rw2" -o \( -iname "*.mts" -not -name "00001.MTS" \) \) ) do datum="$(date -ud@"$(stat -c'%Y' "${quelle}")" '+%Y_%m_%d')" daten["${quelle}"]="${datum}" jahre["${datum}"]="${datum%%_*}" [ ! -d "${zielVerzeichnis}/${datum}" ] && mkdir "${zielVerzeichnis}/${datum}" if [ -e "${zielVerzeichnis}/${datum}/$(basename "${quelle}")" ] then if ! ${ignoriere} then >&2 echo "Datei '${zielVerzeichnis}/${datum}/$(basename "${quelle}")' existiert bereits! Ich beende." exit 1 fi else cp "${quelle}" "${zielVerzeichnis}/${datum}/" fi done summen="$( for quelle in "${!daten[@]}" do datum="${daten["${quelle}"]}" sha512sum "${quelle}" | \ sed "s| $(dirname "${quelle}")| ${datum}|" done )" echo 'Danke, der Photoapparat kann wieder ab.' >&2 cd "${zielVerzeichnis}" echo "${summen}" | \ sha512sum -c tmp_dir=$(mktemp -d ~/tmp-dist/copyPhotos.XXXXXXXXXX) trap 'rm -rf --one-file-system "${tmp_dir:?}"' EXIT tar -cf - "${!jahre[@]}" --xform='s@^\([0-9]\{4\}\)_@\1/\1_@' | \ tar -C "${tmp_dir}" -x pingErg=0 if ${fileserver} then ping -c1 "${endHost}" > /dev/null || \ pingErg=$? else pingErg=1 fi [ ${pingErg} -gt 1 ] && exit ${pingErg} if [ ${pingErg} -eq 0 ] then rsync --progress --ignore-existing -avc "${tmp_dir}/" "${endHost}:${endZielVerzeichnis}/" echo "${summen}" | \ sed 's@^\([0-9a-f]\+ \+\)\([0-9]\{4\}\)_@\1'"${endZielVerzeichnis}"'/\2/\2_@' | \ ssh "${endHost}" 'sha512sum -c' fi erg=${pingErg} pingErg=0 if ${stefanie} then ping -c1 "${zweitHost#*@}" > /dev/null || \ pingErg=$? else pingErg=1 fi [ ${pingErg} -gt 1 ] && exit ${pingErg} if [ ${pingErg} -eq 0 ] then rsync --progress --ignore-existing -avc "${tmp_dir}/" "${zweitHost}:${zweitZielVerzeichnis}/" echo "${summen}" | \ sed 's@^\([0-9a-f]\+ \+\)\([0-9]\{4\}\)_@\1'"${zweitZielVerzeichnis}"'/\2/\2_@' | \ ssh "${zweitHost}" 'sha512sum -c' fi if [ ${pingErg} -gt ${erg} ]; then erg=${pingErg} fi pingErg=0 if ${backup} then ping -c1 "${drittHost#*@}" > /dev/null || \ pingErg=$? else pingErg=1 fi [ ${pingErg} -gt 1 ] && exit ${pingErg} if [ ${pingErg} -eq 0 ] then rsync --progress --ignore-existing -avc "${tmp_dir}/" "${drittHost}:${drittZielVerzeichnis}/" echo "${summen}" | \ sed 's@^\([0-9a-f]\+ \+\)\([0-9]\{4\}\)_@\1'"${drittZielVerzeichnis}"'/\2/\2_@' | \ ssh "${drittHost}" 'sha512sum -c' fi if [ ${pingErg} -gt ${erg} ]; then erg=${pingErg} fi while true do feh -XdF $(printf '%s\n' "${!jahre[@]}" | sort) read -p '"[fkm]:$regex": ' s case "${s}" in "") break ;; "f:"*|"k:"*|"m:"*|"fk:"*|"kf:"*|"mk:"*|"km:"*|"mf:"*|"fm:"*|"kmf:"*|"kfm:"*|"mkf:"*|"fkm:"*|"mfk:"*|"fmk:"*) re="${s#*:}" case "${s%%:*}" in 'f') wen='Friedrich' ;; 'k') wen='Kasimir' ;; 'm') wen='Miranda' ;; 'fk'|'kf') wen='Friedrich und Kasimir' ;; 'fm'|'mf') wen='Friedrich und Miranda' ;; 'km'|'mk') wen='Kasimir und Miranda' ;; 'fkm'|'fmk'|'kfm'|'mfk'|'kmf'|'mkf') wen='Friedrich, Kasimir und Miranda' ;; esac bild="$( echo "${!daten[@]}" | \ tr ' ' '\n' | \ grep "${re}" || true )" if [ "$(echo "${bild}" | wc -l | cut -d' ' -f1)" -ne 1 ] then bild="$( echo "${!daten[@]}" | \ tr ' ' '\n' | \ grep "${re}.*\.[jJ][pP][gG]\$" || true )" fi if [ "$(echo "${bild}" | wc -l | cut -d' ' -f1)" -ne 1 ] || [ -z "${bild}" ] then echo 'Nicht genau ein Treffer, sondern '"$(echo "${bild}" | wc -l | cut -d' ' -f1)"':' echo "${bild}" | \ sed 's|^| |' read s continue fi echo "'${bild}'" bild="${daten["${bild}"]}/$(basename "${bild}")" echo "'$(pwd)/${bild}'" unset was feh -XdF "${bild}" ec[0]='jJyY' ec[1]='nN' while [[ "${ec[0]}" != *"${was}"* ]] && [[ "${ec[1]}" != *"${was}"* ]] || [ -z "${was}" ] do read -p 'Dieses Bild für '"${wen}"' hochladen (j/y/n)? ' was done if [[ "${ec[0]}" == *"${was}"* ]]; then wen_roh=$( printf '%s\n' "${wen}" \ | tr ', ' '\n' \ | grep -vxF und \ | grep -vxF '' ) wen_1=$( printf '%s\n' "${wen_roh}" \ | head -n1 ) scp "${bild}" "${publicHost}/${wen_1}/" ssh "${publicHost%%:*}" ' \ cd "'"${publicHost#*:}"'" '"$( printf '%s\n' "${wen_roh}" \ | sed ' 1d s@.*@ln "'"${wen_1}/${bild##*/}"'" "\0/'"${bild##*/}"'"@ ' )" fi ;; esac done if [ ${erg} -eq 0 ] then echo "${summen}" | \ sed 's|^[0-9a-f]\+ \+||' | \ xargs -r rm echo "${summen}" | \ sed 's|^[0-9a-f]\+ \+||' | \ xargs -rn1 dirname | \ sort -u | \ xargs -r rmdir --ignore-fail-on-non-empty -p fi echo 'Erfolg!' ) # ENDE