#!/bin/sh echo_and_exec() { # echo the argument vector and execute it: { printf '$' printf ' %s' ${1+"$@"} printf '\n' } >&2 ${1+"$@"} } count=0 create_HIERARCHY() { printf >&2 '# Creating hierarchy %s\n' "${1?}" mkdir -p -- "${1?}" && \ dd if=/dev/zero count="$count" bs=1 of="$1"/file 2> /dev/null count="`expr "$count" + 1`" } hardlink_HIERARCHY_to_BACKUPHIERARCHY () { hierarchy="${1?}" && backuphierarchy="${2?}" && shift 2 && \ printf >&2 '# Hardlinking hierarchy %s\n' "$hierarchy" && \ (cd "$hierarchy" && exec find . -print) | \ while read file do if test -d "$hierarchy"/"$file" then mkdir -p -- "$backuphierarchy"/"$file" else ln -f -- "$hierarchy"/"$file" "$backuphierarchy"/"$file" fi || return done } create_ARCHIVE_from_HIERARCHY() { echo_and_exec tar -c -f "${1?}" -- -C "${2?}" file } extract_ARCHIVE_to_HIERARCHY_with_OPTIONS() { archive="${1?}" && hierarchy="${2?}" && shift 2 && \ { { printf '$ tar -x -f %s' "$archive" if test -n "${1+defined}" then printf ' %s' ${1+"$@"} fi printf ' \\\n' printf ' -- -C %s\n' "$hierarchy" } >&2 tar -x -f "$archive" ${1+"$@"} -- -C "$hierarchy" } } lookup_ARCHIVE_in_HIERARCHIES() { archive="${1?}" && shift && \ for hierarchy in ${1+"$@"} do tar -t -f "$archive" | \ while read member do echo "$hierarchy"/"$member" done done | \ { # put all filenames into argv: # clear argv and set initial empty arg1: set '' while read file do set ${1+"$@"} "$file" done # remove initial '' arg1 shift if test "$#" -ge 1 then { printf '$ ls -dogi -ctr --' if test "$#" -eq 1 then format=' %s' else format=' \\\n %s' fi printf "$format" ${1+"$@"} printf '\n' } >&2 ls -dogi -ctr -- ${1+"$@"} fi } } echo_and_exec uname -srm echo_and_exec tar --version echo_and_exec rm -rf -- archive 1 2 && \ { ec=0 for testcase in older/keep-newer-files \ older/keep-newer-files_overwrite older/overwrite_keep-newer-files \ older/keep-newer-files_unlink-first older/unlink-first_keep-newer-files do create_HIERARCHY 1/"$testcase" && \ hardlink_HIERARCHY_to_BACKUPHIERARCHY 1/"$testcase" 2/"$testcase" ec="$?" if test "$ec" -ne 0 then break fi done (exit "$ec") } && \ echo_and_exec sleep 3 && \ create_HIERARCHY archive && \ create_ARCHIVE_from_HIERARCHY archive.tar archive && \ { echo '# table of contents of archive archive.tar:' echo_and_exec tar -tv -f archive.tar } && \ echo_and_exec sleep 3 && \ { ec=0 for testcase in newer/keep-newer-files \ newer/keep-newer-files_overwrite newer/overwrite_keep-newer-files \ newer/keep-newer-files_unlink-first newer/unlink-first_keep-newer-files do create_HIERARCHY 1/"$testcase" && \ hardlink_HIERARCHY_to_BACKUPHIERARCHY 1/"$testcase" 2/"$testcase" ec="$?" if test "$ec" -ne 0 then break fi done (exit "$ec") } && \ echo_and_exec sleep 3 && \ { lookup_ARCHIVE_in_HIERARCHIES archive.tar \ 1/older/keep-newer-files \ 2/older/keep-newer-files \ 1/older/keep-newer-files_overwrite \ 2/older/keep-newer-files_overwrite \ 1/older/overwrite_keep-newer-files \ 2/older/overwrite_keep-newer-files \ 1/older/keep-newer-files_unlink-first \ 2/older/keep-newer-files_unlink-first \ 1/older/unlink-first_keep-newer-files \ 2/older/unlink-first_keep-newer-files \ archive \ 1/newer/keep-newer-files \ 2/newer/keep-newer-files \ 1/newer/keep-newer-files_overwrite \ 2/newer/keep-newer-files_overwrite \ 1/newer/overwrite_keep-newer-files \ 2/newer/overwrite_keep-newer-files \ 1/newer/keep-newer-files_unlink-first \ 2/newer/keep-newer-files_unlink-first \ 1/newer/unlink-first_keep-newer-files \ 2/newer/unlink-first_keep-newer-files extract_ARCHIVE_to_HIERARCHY_with_OPTIONS \ archive.tar 1/older/keep-newer-files --keep-newer-files lookup_ARCHIVE_in_HIERARCHIES \ archive.tar 1/older/keep-newer-files extract_ARCHIVE_to_HIERARCHY_with_OPTIONS \ archive.tar 1/older/keep-newer-files_overwrite \ --keep-newer-files --overwrite lookup_ARCHIVE_in_HIERARCHIES \ archive.tar 1/older/keep-newer-files_overwrite extract_ARCHIVE_to_HIERARCHY_with_OPTIONS \ archive.tar 1/older/overwrite_keep-newer-files \ --overwrite --keep-newer-files lookup_ARCHIVE_in_HIERARCHIES \ archive.tar 1/older/overwrite_keep-newer-files extract_ARCHIVE_to_HIERARCHY_with_OPTIONS \ archive.tar 1/older/keep-newer-files_unlink-first \ --keep-newer-files --unlink-first lookup_ARCHIVE_in_HIERARCHIES \ archive.tar 1/older/keep-newer-files_unlink-first extract_ARCHIVE_to_HIERARCHY_with_OPTIONS \ archive.tar 1/older/unlink-first_keep-newer-files \ --unlink-first --keep-newer-files lookup_ARCHIVE_in_HIERARCHIES \ archive.tar 1/older/unlink-first_keep-newer-files extract_ARCHIVE_to_HIERARCHY_with_OPTIONS \ archive.tar 1/newer/keep-newer-files \ --keep-newer-files lookup_ARCHIVE_in_HIERARCHIES \ archive.tar 1/newer/keep-newer-files extract_ARCHIVE_to_HIERARCHY_with_OPTIONS \ archive.tar 1/newer/keep-newer-files_overwrite \ --keep-newer-files --overwrite lookup_ARCHIVE_in_HIERARCHIES \ archive.tar 1/newer/keep-newer-files_overwrite extract_ARCHIVE_to_HIERARCHY_with_OPTIONS \ archive.tar 1/newer/overwrite_keep-newer-files \ --overwrite --keep-newer-files lookup_ARCHIVE_in_HIERARCHIES \ archive.tar 1/newer/overwrite_keep-newer-files extract_ARCHIVE_to_HIERARCHY_with_OPTIONS \ archive.tar 1/newer/keep-newer-files_unlink-first \ --keep-newer-files --unlink-first lookup_ARCHIVE_in_HIERARCHIES \ archive.tar 1/newer/keep-newer-files_unlink-first extract_ARCHIVE_to_HIERARCHY_with_OPTIONS \ archive.tar 1/newer/unlink-first_keep-newer-files \ --unlink-first --keep-newer-files lookup_ARCHIVE_in_HIERARCHIES \ archive.tar 1/newer/unlink-first_keep-newer-files }