1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
#!/usr/bin/env bash
set -u
usage() {
cat <<EOF
Usage: sync-tree [-h] [-c] [-x] SOURCE/ DEST/
Make the DEST tree match SOURCE as closely as possible
OPTIONS:
-h
Display help
EOF
}
while getopts "h" OPTION
do
case "$OPTION" in
h) usage; exit 0;;
?) usage 1>&2; exit 1;;
esac
done
shift $(($OPTIND - 1)) || exit $?
if ! test $# -eq 2
then
usage 1>&2
exit 1
fi
src="$1"
dest="$2"
rsync_opts="-aH --delete"
rsync_version=$(rsync --version)
if [[ ! "$rsync_version" =~ "ACLs" ]] || [[ "$rsync_version" =~ "no ACLs" ]]; then
echo "Not syncing ACLs (not supported by available rsync)" 1>&2
else
case $OSTYPE in
cygwin|darwin|netbsd)
echo "Not syncing ACLs (not yet supported on $OSTYPE)" 1>&2
;;
*)
rsync_opts="$rsync_opts -A"
;;
esac
fi
xattrs_available=''
if [[ ! "$rsync_version" =~ "xattrs" ]] || [[ "$rsync_version" =~ "no xattrs" ]]; then
echo "Not syncing xattrs (not supported by available rsync)" 1>&2
else
xattrs_available=yes
fi
# rsync may fail if -X is specified and the filesystems don't support
# xattrs.
if test "$xattrs_available"; then
rsync $rsync_opts -X "$src" "$dest"
if test $? -ne 0; then
# Try again without -X
exec rsync $rsync_opts "$src" "$dest"
fi
else
exec rsync $rsync_opts "$src" "$dest"
fi
|