diff options
-rwxr-xr-x | backomp | 40 |
1 files changed, 23 insertions, 17 deletions
@@ -7,9 +7,13 @@ function flr(n, s) { return int(n / s) * s } BEGIN { split("h d w m", buckets) - for (i in buckets) + for (i in buckets) { if (match(retain, "([*0-9]+)" buckets[i], md) && md[1]) ret[buckets[i]] = md[1] + + if (index(replace, buckets[i])) + repl[buckets[i]] = 1 + } } { @@ -19,11 +23,17 @@ BEGIN { bt["h"] = flr(t, 60*60) bt["d"] = flr(t, 24*60*60) bt["m"] = mktime(strftime("%Y %m", t, 1) " 01 00 00 00", 1) - bt["w"] = m + flr(t - m, 7*24*60*60) + bt["w"] = bt["m"] + flr(t - bt["m"], 7*24*60*60) + + for (i = 1; i <= length(buckets); ++i) { + b = buckets[i] + + if (!ret[b] || (b in repl && (b, bt[b]) in bkeep)) + continue - for (b in ret) if ((b, bt[b]) in bkeep || ret[b] == "*" || bc[b]++ < ret[b]) bkeep[b, bt[b]] = $1 + } } END { @@ -44,6 +54,7 @@ backup() { dest_dir="${1}" src_path="${2}" retain="${3:-"*h*d*w*m"}" + replace="${4:-"h"}" [[ "$((dcount++))" -ne 0 ]] && echo echo "[${dcount}] [${retain}] ${src_path} => ${dest_dir}" @@ -56,8 +67,8 @@ backup() { snaps=("${dest_path}" "${snaps[@]}") mapfile -t keep < <( - awk -v "retain=${retain}" "${FILTER_AWK}" < <( - printf '%s\n' "${snaps[@]}")) + awk -v "retain=${retain}" -v "replace=${replace}" \ + "${FILTER_AWK}" < <(printf '%s\n' "${snaps[@]}")) if [[ -z "${keep}" ]]; then echo "WARNING: dirs to keep shouldn't be empty; skipping" >&2 return @@ -74,22 +85,17 @@ backup() { printf 'kept %s\n' "${keep[@]}" } +declare -A opts while IFS='=' read -r f1 f2; do [[ -z "${f1}" ]] && continue if [[ "${f1}" =~ ^\[(.*)]$ ]]; then base_path="${BASH_REMATCH[1]}" - retain= - continue - fi - - if [[ "${f1}" == '$'* ]]; then - if [[ "${f1}" == '$retain' ]]; then - retain="${f2}" - fi - - continue + opts=() + elif [[ "${f1}" == '$'* ]]; then + opts["${f1:1}"]="${f2}" + else + backup "${base_path}/${f1}" "${f2}" \ + "${opts['retain']}" "${opts['replace']}" fi - - backup "${base_path}/${f1}" "${f2}" "${retain}" done < "${1}" |