diff options
Diffstat (limited to 'bin')
| -rwxr-xr-x | bin/diffdir | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/bin/diffdir b/bin/diffdir new file mode 100755 index 0000000..57997ed --- /dev/null +++ b/bin/diffdir @@ -0,0 +1,43 @@ +#!/bin/sh + +Version='diffdir-0.1' + +diffdir() { + [ -f "/etc/backup/ignore" ] && xf=--exclude-from=/etc/backup/ignore || xf= + rsync -aDSniv $xf --delete $Optx "$2/" "$1" | + awk -v OptF="${OptF#./}" -v prefix=$prefix ' + NF == 0 {exit} + NR < 2 || /\/*\.dv$/ || /\/$/ {next} + # Match an itemized status for all versions of rsync -i + $1 !~ /^[<>ch.*][fdLDS+][.+?cstpoguaxz]+$/ {next} + {key = $1; file = substr($0, length(key) + 2)} + OptF && OptF != file {next} + key == "*deleting" {print "deleted " prefix file; next} + substr(key, 3, 7) == "+++++++" {print "created " prefix file; next} + { # Avoid false positive if only mtime is changed. + of = "'$1'/" file; gsub("'\''", "'\'\\\\\'\''", of) + nf = "'$2'/" file; gsub("'\''", "'\'\\\\\'\''", nf) + if (substr(key, 2, 1) == "L") { # Symlink + src = target = file + sub(/.* -> /, "", target); + sub(/ -> .*/, "", src); + "readlink '$2'/" src | getline otarget + if (target != otarget) + print "changed " src + } else if (system("cmp -s '\''" of "'\'\ \''" nf "'\''")) + print "changed " file + }' + # Or: scan key for file/link size, checksum or permission change + # rsync -c is required + #key ~ /[cps]/ { print "changed " prefix file }' +} + +while getopts :V opt; do + case $opt in + (V) echo "$Version"; exit ;; + (*) echo "Usage: $0 [-V]"; exit 1 ;; + esac +done +shift $((OPTIND - 1)) + +diffdir "$1" "$2" |
