#! /bin/sh # mvdir -- move whole directories # $Id$ # Carlos Duarte, 961222/980722 USAGE="\ usage: $0 [-hn] srcs... dest -h this help -n no op -u user specifies user for chowing files to -g group same as -u, but for groups -v be verbose -0 use -0 option, for gnu tools copies whole srcs... to dest. all args must be directories. examples: $0 /tmp_mount1/home /tmp_mount2/home /home will merge both homes, on a single local /home directory $0 /usr/src . all dirs on /usr/src to current one " while : ; do case x"$1" in x-h) echo "$USAGE"; exit 1 ;; x-n) FAKE=yes ;; x-u) shift; U=$1 ;; x-g) shift; G=$1 ;; x-v) VERB=v ;; x-0) ZERO=0 ;; x--) shift; break ;; x-?) echo "invalid option -- `echo $1|cut -c2-`" echo "$USAGE"; exit 1 ;; *) break ;; esac shift done # source dest, required if test $# -lt 2; then echo "$USAGE"; exit 1; fi P=`pwd` eval dest="\$$#" case "$dest" in /*) my_dest="$dest" ;; *) my_dest="$P/$dest" ;; esac cmd="cpio -pdma$ZERO$VERB \ `echo $U : $G | sed 's/ //g; /^:$/d; s/:$//; s/^/-R/'` $my_dest" while test "$1" != "$dest"; do case "$1" in /*) src_dir="$1";; *) src_dir="$P/$1" ;; esac if test x$FAKE = xyes; then echo "cd $src_dir && find . -print$ZERO | $cmd" else if cd "$src_dir" 2>/dev/null 1>&2 ; then find . -print$ZERO | $cmd else echo skipping $1: not a directory... 1>&2 fi fi shift done exit