VMS style versioning backup of individual files
This commit is contained in:
parent
257d161cf5
commit
96fa193e22
42
backupf.sh
Executable file
42
backupf.sh
Executable file
@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
# vms_cp.sh — copy file with VMS-style version suffix (:1, :2, ...)
|
||||
# Usage: ./vms_cp.sh <filename>
|
||||
|
||||
set -e
|
||||
|
||||
if [ $# -ne 1 ]; then
|
||||
echo "Usage: $0 <filename>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
src="$1"
|
||||
if [ ! -f "$src" ]; then
|
||||
echo "Error: '$src' not found or not a regular file."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
dir=$(dirname "$src")
|
||||
base=$(basename "$src")
|
||||
|
||||
# Escape regex special chars for grep
|
||||
base_escaped=$(printf '%s\n' "$base" | sed 's/[][\.*^$(){}?+|/]/\\&/g')
|
||||
|
||||
# Collect existing version numbers (files like name:1, name:2, etc.)
|
||||
versions=()
|
||||
while IFS= read -r f; do
|
||||
[[ $f =~ :([0-9]+)$ ]] && versions+=("${BASH_REMATCH[1]}")
|
||||
done < <(ls "$dir" 2>/dev/null | grep -E "^${base_escaped}:[0-9]+$" || true)
|
||||
|
||||
# Determine next version number
|
||||
if [ ${#versions[@]} -eq 0 ]; then
|
||||
next_ver=1
|
||||
else
|
||||
max_ver=$(printf "%s\n" "${versions[@]}" | sort -n | tail -1)
|
||||
next_ver=$((max_ver + 1))
|
||||
fi
|
||||
|
||||
dest="${src}:${next_ver}"
|
||||
cp -p -- "$src" "$dest"
|
||||
|
||||
echo "Created backup: $dest"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user