From 549fd13ee5fcf010ee98e6f011366e941dc738b0 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Sat, 17 Dec 2016 22:20:29 +0100 Subject: fastRepair neu --- .gitignore | 1 + fastRepair.in | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 fastRepair.in diff --git a/.gitignore b/.gitignore index 284ebda..c636107 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ backup backupStatistics +fastRepair lastBackups man.commons *.common diff --git a/fastRepair.in b/fastRepair.in new file mode 100644 index 0000000..fb89956 --- /dev/null +++ b/fastRepair.in @@ -0,0 +1,88 @@ +#!/bin/bash + +# fastRepair version #VERSION# + +[ -r "/etc/backup.conf" ] && \ + . "/etc/backup.conf" + +dummy=false +if [ $# -eq 1 ] \ + && [ "$1" == "-d" ] +then + shift + dummy=true +fi + +if [ $# -ne 0 ] +then + >&2 echo "too many arguments: '$@'" + exit 1 +fi + +for backupID in "${!backups[@]}" +do + backupDir="${backups["${backupID}"]%% *}" + lastDate="$( + ls -1 "${backupDir}" | \ + sort -r | \ + grep -m1 '^[0-9]\{4\}\(_[0-9]\{2\}\)\{2\}$' + )" + + dateList=$( + ls -1 "${backupDir}" | \ + sort -r | \ + grep '^[0-9]\{4\}\(_[0-9]\{2\}\)\{2\}$' | \ + grep -v "^${lastDate}" + ) + + [ -z "${dateList}" ] \ + && continue + + set -e + + echo -n "${backupID}: " + + find "${backupDir}${lastDate}" -type f -links 1 | \ + wc -l + + find "${backupDir}${lastDate}" -type f -links 1 | \ + sed "s|^${backupDir}${lastDate}/||" | \ + while read -r datei + do + for date in ${dateList} + do + [ -f "${backupDir}${date}/${datei}" ] \ + || break + diff -q "${backupDir}${lastDate}/${datei}" "${backupDir}${date}/${datei}" > /dev/null \ + || break + nlinks=$( + stat -c'%h' "${backupDir}${date}/${datei}" + ) + [ ${nlinks} -eq 65000 ] \ + && continue + rights=$(stat -c'%a' "${backupDir}${lastDate}/${datei}") + uid=$(stat -c'%u' "${backupDir}${lastDate}/${datei}") + gid=$(stat -c'%g' "${backupDir}${lastDate}/${datei}") + timeModification=$(stat -c'%y' "${backupDir}${lastDate}/${datei}") + + echo rm \"${backupDir}${lastDate}/${datei}\" + echo ln \"${backupDir}${date}/${datei}\" \"${backupDir}${lastDate}/${datei}\" + echo chown ${uid}:${gid} \"${backupDir}${lastDate}/${datei}\" + echo chmod ${rights} \"${backupDir}${lastDate}/${datei}\" + echo touch -m -d \"${timeModification}\" \"${backupDir}${lastDate}/${datei}\" + + if ! ${dummy} + then + rm "${backupDir}${lastDate}/${datei}" + ln "${backupDir}${date}/${datei}" "${backupDir}${lastDate}/${datei}" + chown ${uid}:${gid} "${backupDir}${lastDate}/${datei}" + chmod ${rights} "${backupDir}${lastDate}/${datei}" + touch -m -d "${timeModification}" "${backupDir}${lastDate}/${datei}" + fi + break + done + done + + set +e + +done -- cgit v1.2.3-54-g00ecf