function _rename
# rename (i.e., move) function
{
	trap "set +f" 0
	typeset prefix suffix rest prefix2 suffix2 rest2 dir
	if test -d $1 -a \( -d "$2" -o "$2" = "" \)
	then	set $1 ${2:=.}
		set +f
		_Ducmd "mv $1/* $2"
	else
		rest=`basename ${1}`
		dir=${1%$rest}
		if test "$dir" = "*"
	 	then	dir=""
		# a ksh patch
		fi
		set $rest ${2:=.}
		case $1 in
		\**)	prefix='*'
			rest=${1#[$prefix]};;
		\?*)	rest="`expr $1 : '\?*\([^?]*\)'`"
			prefix=${1%$rest};;
		*\*)	suffix='*'
			rest=${1%[$suffix]};;
		*\?)	rest="`expr $1 : '\([^?]*\)\?*'`"
			suffix="${1#$rest}";;
		*)	prefix=
			suffix=
			rest="$1";;
		esac
		case $2 in
		\**)	prefix2='*'
			rest2=${2#[$prefix2]};;
		\?*)	rest2="`expr $2 : '\?*\([^?]*\)'`"
			prefix2="${2%$rest2}";;
		*\*)	suffix2='*'
			rest2=${2%[$suffix2]};;
		*\?)	rest2="`expr $2 : '\([^?]*\)\?*'`"
			suffix2="${2#$rest2}";;
		*)	prefix2=
			suffix2=
			rest2="$1";;
		esac
		set +f
		for i in $dir$1
		do
		i=`basename $i`
		case $1 in
		\**|\?*)	case $2 in
			*\*)	tofile="${rest2}${i%$rest}";;
			\**)	tofile="${i%$rest}${rest2}";;
			\?*)	tofile="${i%${i#$prefix2}}${rest2}";;
			*\?)	tofile="${rest2}${i#${i%$suffix2}}";;
			esac
			;;
		*\*|*\?)	case $2 in
			*\*)	tofile="${rest2}${i#$rest}";;
			\**)	tofile="${i#$rest}${rest2}";;
			\?*)	tofile="${i%${i#$prefix2}}${rest2}";;
			*\?)	tofile="${rest2}${i#${i%$suffix2}}";;
			esac
			;;
		*)	tofile=$2;;
		esac
		if test "$tofile" != ""
		then	_Ducmd "mv ${dir}$i $tofile"
		else	print "Error: ${dir}$i invalid"
		fi
		done
	fi
}

alias -x REN='set -f; _rename'\
	RENAME='set -f; _rename'\
	ren='set -f; _rename'\
	rename='set -f; _rename'
typeset -xf _rename
