Преглед изворни кода

First draft of a name-based BC sync tool. I know rsync does this with whole files, but that is not what I am looking for

Zachary Kotlarek пре 13 година
родитељ
комит
062940e12a
1 измењених фајлова са 77 додато и 0 уклоњено
  1. 77 0
      sync.sh

+ 77 - 0
sync.sh

@@ -0,0 +1,77 @@
+#!/bin/bash
+
+# Config
+BASE_LOCAL="`~/bin/video/mediaPath`"
+BASE_REMOTE="/Volumes/Bitcasa Infinite Drive"
+
+# Command-line arguments
+SUB_DIR="${1}"
+if [ -z "${SUB_DIR}" ]; then
+	echo "Usage: `basename "${0}"` sub_directory" 1>&2
+	exit 1
+fi
+
+# Sanity checks
+if [ ! -d "${BASE_LOCAL}/${SUB_DIR}" ]; then
+	echo "Invalid local directory: ${BASE_LOCAL}/${SUB_DIR}" 1>&2
+	exit 1
+fi
+if [ ! -d "${BASE_REMOTE}" ]; then
+	echo "Bitcasa drive not mounted" 1>&2
+	exit 1
+fi
+
+# Ensure the subdirectory exists on the remote drive
+if [ ! -d "${BASE_REMOTE}/${SUB_DIR}" ]; then
+	mkdir -p "${BASE_REMOTE}/${SUB_DIR}"
+fi
+
+# Grab directory tree lists
+TMP_LOCAL="`mktemp -t sync.local.XXXXXXXX`"
+(cd "${BASE_LOCAL}" && find "${SUB_DIR}" > "${TMP_LOCAL}")
+TMP_REMOTE="`mktemp -t sync.remote.XXXXXXXX`"
+(cd "${BASE_REMOTE}" && find "${SUB_DIR}" > "${TMP_REMOTE}")
+
+# Diff to find the first mis-matched file
+DIFF="`diff -u "${TMP_LOCAL}" "${TMP_REMOTE}" | grep "^[\+\-]${SUB_DIR}"`"
+
+# Filter junk
+DIFF="`echo "${DIFF}" | grep -v '\/\._' | grep -v '\/\.DS_Store$'`"
+
+# Choose the file/directory to sync
+FILE="`echo "${DIFF}" | head -n 1`"
+ACTION="`echo "${FILE}" | head -c 1`"
+FILE="`echo "${FILE}" | cut -d "${ACTION}" -f 2`"
+
+# Determine the action (i.e. copy to or delete from remote)
+if [ "${ACTION}" == '+' ]; then
+	echo "Will not delete from remote: ${FILE}" 1>&2
+	exit 2
+elif [ "${ACTION}" == '-' ]; then
+	PATH_LOCAL="${BASE_LOCAL}/${FILE}"
+	PATH_REMOTE="${BASE_REMOTE}/${FILE}"
+
+	if [ -h "${PATH_LOCAL}" ]; then
+		echo "Unable to create symlink: ${FILE}" 1>&2
+		exit 2
+	elif [ -d "${PATH_LOCAL}" ]; then
+		echo "Creating directory: ${FILE}"
+		mkdir "${PATH_REMOTE}"
+	elif [ -f "${PATH_LOCAL}" ] && [ -r "${PATH_LOCAL}" ]; then
+		echo "Copying: ${FILE}"
+		cp "${BASE_LOCAL}/${FILE}" "${BASE_REMOTE}/${FILE}"
+	else
+		echo "Unable to copy file: ${FILE}" 1>&2
+		exit 2
+	fi
+else
+	echo "Invalid action: ${ACTION}" 1>&2
+	echo -n "\tDiff: "
+	echo "${DIFF}" | head -n 1
+	exit 2
+fi
+
+# Cleanup
+rm -f "${TMP_LOCAL}"
+rm -f "${TMP_REMOTE}"
+exit 0