summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-12-17 22:20:29 +0100
committerErich Eckner <git@eckner.net>2017-01-05 21:57:13 +0100
commit549fd13ee5fcf010ee98e6f011366e941dc738b0 (patch)
tree82a9527dfc270344d62d6f95d9a3f8ee08ab9f98
parentd19da7c994311424166bcefcadfe2d66c023bf95 (diff)
downloadhardlinkedBackups-549fd13ee5fcf010ee98e6f011366e941dc738b0.tar.xz
fastRepair neu
-rw-r--r--.gitignore1
-rw-r--r--fastRepair.in88
2 files changed, 89 insertions, 0 deletions
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