#!/bin/bash ( # ANFANG set -e verwendung() { echo 'copyPhotos [-i]' echo ' -i übergehe bereits vorhandene Dateien ohne zu meckern' echo ' -o Ignoriere, wenn ein Backup-server offline ist.' exit 1 } zielVerzeichnis=~/Bilder ziele=(# 'erich@fileserver:Bilder/Fotos' 'erich@pizza:data/Bilder/Fotos' 'data@backup:raid/Bilder/Fotos' 'erich@backup-lo:/mnt/crypted/transfer/Bilder') publicHost="ecknernet@eckner.net:backstage/downloadarea" unset daten unset jahre declare -A daten declare -A jahre ignoriere=false offline_erlaubt=false eval set -- "$( getopt -o io -n "$(basename "$0")" -- "$@" || \ echo verwendung )" while true do case "$1" in -i) ignoriere=true ;; -o) offline_erlaubt=true ;; --) 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 while read -r quelle; 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 \ < <( find -files0-from <( ls -d /mnt/{android/*/DCIM,usb}/ \ | tr '\n' '\0' ) \ -name Screenshots -prune , \ -type f \ \( \ -iname "*.jpg" -o \ -iname "*.rw2" -o \ -iname "*.mts" \ \) \ ) 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-disk/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 erg=0 for ziel in "${ziele[@]}"; do host="${ziel%:*}" verzeichnis="${ziel#*:}" pingErg=0 pingHost=$( sed -n '/^Host '"${host#*@}"'$/,/^$/ { s/^\s\+Hostname \(\S\+\)$/\1/ T p }' ~/.ssh/config ) if [ -z "${pingHost}" ]; then pingHost="${host#*@}" fi ping -c1 "${pingHost}" > /dev/null || \ pingErg=$? ! ${offline_erlaubt} && [ ${pingErg} -gt 1 ] && exit ${pingErg} if [ ${pingErg} -eq 0 ] then rsync --progress --ignore-existing -avc "${tmp_dir}/" "${host}:${verzeichnis}/" echo "${summen}" | \ sed 's@^\([0-9a-f]\+ \+\)\([0-9]\{4\}\)_@\1'"${verzeichnis}"'/\2/\2_@' | \ ssh "${host}" 'sha512sum -c' fi if [ ${pingErg} -gt ${erg} ]; then erg=${pingErg} fi done while true do feh -XdF $(printf '%s\n' "${!jahre[@]}" | sort) read -p '"[kfmi]:$regex": ' s case "${s}" in "") break ;; *":"*) printf '%s\n' "${s}" \ | grep -qi '^[kfmi]\+:' \ || continue re="${s#*:}" wen='' for wer in 'k:Kasimir' 'f:Friedrich' 'm:Miranda' 'i:Isidor'; do printf '%s\n' "${s%%:*}" \ | grep -qF "${wer%:*}" \ && wen="${wen}${wen:+, }${wer#*:}" done wen=$( printf '%s\n' "${wen}" \ | sed ' s@, \(\S\+\)$@ und \1@ ' ) bild="$( printf '%s\n' "${!daten[@]}" | \ grep "${re}" || true )" if [ "$(echo "${bild}" | grep -vxFc '' | cut -d' ' -f1)" -ne 1 ] then bild="$( printf '%s\n' "${!daten[@]}" | \ grep "${re}.*\.[jJ][pP][gG]\$" || true )" fi if [ "$(printf '%s\n' "${bild}" | grep -vxFc '')" -ne 1 ] then echo 'Nicht genau ein Treffer, sondern '"$(printf '%s\n' "${bild}" | grep -vxFc '')"':' 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