#!/bin/bash md5d() { [ -d "$1" ] && { find "$1" -type f -exec md5 {} \; | sort } || { md5 "$1" } } tac() { tail -r } set -- $(printf "%s\n" "$@" | tac) base="$1" while [ "$2" != '' ]; do for p in "$base"/*; do b="$(basename "$p")" if [[ -e "$2/$b" ]]; then diff -q <(cd "$base" && md5d "$b") <(cd "$2" && md5d "$b") > /dev/null && { echo "$base/$b" "$2/$b" matched (cd "$2" && rm -rf "$b" && ln -s ../"$base/$b" . ) } || { :; # echo "$base/$b" and "$2/$b" differ } else :; # echo "$2/$b" not found fi done shift done