diff options
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/movefiles | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/scripts/movefiles b/scripts/movefiles new file mode 100755 index 0000000..74d91d9 --- /dev/null +++ b/scripts/movefiles @@ -0,0 +1,74 @@ +#!/bin/sh + +set -e +set -u + +src='' +dst='' + +usage () { +cat << USAGE +Moves files and directories using GNU Tar. +Usage: +$0 -s sourcedir -d destdir files ... +USAGE +exit 1 +} + +fatal () { + echo "$@" >&2 + echo "Type \`$0 -h' to get help." >&2 + exit 2 +} + +while getopts hd:s: opt; do + case "$opt" in + s) src="$OPTARG";; + d) dst="$OPTARG";; + *) usage;; + esac +done +shift $OPTIND-1 + + +if [ -z "$src" ]; then + fatal "Missing source directory." +fi +if ! [ -e "$src" ]; then + fatal "\`$src' does not exist." +fi +if ! [ -d "$src" ]; then + fatal "\`$src' is not a directory." +fi +if [ -z "$dst" ]; then + fatal "Missing destination directory." +fi +if ! [ -e "$dst" ]; then + fatal "\`$dst' does not exist." +fi +if ! [ -d "$dst" ]; then + fatal "\`$dst' is not a directory." +fi + +src_n=`cd "$src" && pwd` +dst_n=`cd "$dst" && pwd` + +if [ "$src_n" = "$dst_n" ]; then + fatal "\`$src' and \`$dst' are the same." +fi + +list="/tmp/cibs-movelist.$$" + +rm -f "$list" + +for f in "$@"; do + ( set -x; cd "$src_n" && gfind $f ! -type d -print || true ) >> "$list" +done + +( set -e; set -x; cd "$src_n" && gtar cf - -T "$list" ) | \ + ( set -e; set -x; cd "$dst_n" && gtar xf - ) + +(set -e; set -x; cd "$src_n" && cat "$list" | xargs rm -f ) + +exit 0 + |