aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSylvain Herlédan <sylvain.herledan@hrafnagud.info>2026-07-16 21:42:02 +0200
committerSylvain Herlédan <sylvain.herledan@hrafnagud.info>2026-07-16 21:42:02 +0200
commita7e08a6fe7ecdcf454ba67eaf8a852bfb85790f1 (patch)
treef266e5a8919bdece52fa41347b293e459874fc24
parent799fb1a9186d3e810fb7e9ca09646581f3cab5c5 (diff)
downloadadmin_toolbox-a7e08a6fe7ecdcf454ba67eaf8a852bfb85790f1.tar.gz
admin_toolbox-a7e08a6fe7ecdcf454ba67eaf8a852bfb85790f1.tar.bz2
admin_toolbox-a7e08a6fe7ecdcf454ba67eaf8a852bfb85790f1.zip
Bashify ddrescue_r
-rwxr-xr-xddrescue_r68
1 files changed, 53 insertions, 15 deletions
diff --git a/ddrescue_r b/ddrescue_r
index f2d55c1..38fddc4 100755
--- a/ddrescue_r
+++ b/ddrescue_r
@@ -1,16 +1,54 @@
-#!/bin/sh
+#!/bin/bash
-echo '------------------------------------------------------------------------'
-ilen=(1+${#1})
-find "${1}" -type d -print0 | while read -d $'\0' d;do
- dname="${d:${ilen}}"
- echo "*** ${dname}"
- mkdir -p "${dname}"
-done
-echo "Directory tree restored"
-find "${1}" -type f -print0 | while read -d $'\0' f; do
- fname="${f:${ilen}}"
- echo "+++ ${fname}"
- ddrescue "${1}/${fname}" "${2}/${fname}"
-done
-echo "Done."
+set -o nounset
+set -o errexit
+set -o pipefail
+
+readonly ARGS=( "${@}" );
+
+main()
+{
+ local _input_root;
+ _input_root="${1}"; shift;
+
+ local _output_root;
+ _output_root="${1}"; shift;
+
+ local input_root;
+ input_root="$(readlink --canonicalize-existing "${_input_root}")";
+
+ local output_root;
+ output_root="$(readlink --canonicalize-missing "${_output_root}")";
+
+ local input_length;
+ input_length=$((${#input_root} + 1));
+
+ find "${input_root}" -type d -print0 \
+ | while read -r -d $'\0' d;
+ do
+ local dname;
+ dname="${d:${input_length}}";
+
+ local target;
+ target="${output_root}/${dname}";
+
+ >&2 echo "*** ${dname}/"
+ mkdir -p "${target}"
+ done
+
+ >&2 echo "Directory tree restored"
+
+ find "${input_root}" -type f -print0 \
+ | while read -r -d $'\0' f;
+ do
+ local fname;
+ fname="${f:${input_length}}";
+
+ >&2 echo "+++ ${fname}"
+ ddrescue --quiet "${input_root}/${fname}" "${output_root}/${fname}"
+ done
+
+ >&2 echo "Done."
+}
+
+main "${ARGS[@]}"