1#! /bin/sh 2# follows symbolic links. to do otherwise is painful. 3 4usage() { 5 echo "usage: $0 [ -o owner] [ -g group ] [ -m mode ] -d dir ..." 6 echo " $0 [ -o owner] [ -g group ] [ -m mode ] file destfile" 7 echo " $0 [ -o owner] [ -g group ] [ -m mode ] file file ... destdir" 8 exit 1 9} 10 11installone() { 12 cp -f -p $1 $2 13 if [ "$owner" != "" ] ; then chown $owner $2; fi 14 if [ "$group" != "" ] ; then chgrp $group $2; fi 15 if [ "$mode" != "" ] ; then chmod $mode $2; fi 16} 17 18mkdir=0 19 20while [ $# -ge 0 ] ; do 21 case $1 in 22 -d) mkdir=1 ;; 23 -o) shift; owner=$1 ;; 24 -g) shift; group=$1 ;; 25 -m) shift; mode=$1 ;; 26 -*) usage ;; 27 *) break ;; 28 esac 29 shift 30done 31 32if [ $mkdir -eq 1 ] ; then 33 dirs=$* 34 35 for dir in $dirs ; do 36 case $dir in 37 /*) ;; 38 *) echo "directory name must begin with /; $dir does not" ; exit 1 ;; 39 esac 40 41 stack="$dir" 42 while [ "$dir" != "/" ] ; do 43 stack="$dir $stack" 44 dir=`dirname $dir` 45 done 46 47 for dir in $stack ; do 48 if [ ! -e $dir ] ; then 49 mkdir $dir 50 if [ "$owner" != "" ] ; then chown $owner $dir ; fi 51 if [ "$group" != "" ] ; then chgrp $group $dir ; fi 52 if [ "$mode" != "" ] ; then chmod $mode $dir ; fi 53 fi 54 done 55 done 56elif [ $# -eq 2 -a ! -d $2 ] ; then 57 installone $1 $2 58elif [ $# -ge 2 ] ; then 59 files="" 60 while [ $# -ne 1 ] ; do 61 files="$files $1" 62 shift 63 done 64 dest=$1 65 66 if [ ! -d $dest ]; then usage; fi 67 68 for file in $files ; do 69 installone $file $dest/`basename $file` 70 done 71else 72 usage 73fi 74