| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | #! /bin/bash | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # original from: | 
					
						
							|  |  |  | # @(#) rename.ksh 1.1 94/05/10 | 
					
						
							|  |  |  | # 90/06/01 John DuBois (spcecdt@armory.com) | 
					
						
							|  |  |  | # 91/02/25 Improved help info | 
					
						
							|  |  |  | # 92/06/07 remove quotes from around shell pattern as required by new ksh | 
					
						
							|  |  |  | # 94/05/10 Exit if no globbing chars given. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # conversion to bash v2 syntax by Chet Ramey | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | phelp() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | echo "$usage | 
					
						
							|  |  |  | All files that match oldpattern will be renamed with the | 
					
						
							|  |  |  | filename components that match the constant parts of oldpattern | 
					
						
							|  |  |  | changed to the corresponding constant parts of newpattern. | 
					
						
							|  |  |  | The components of the filename that match variable parts of | 
					
						
							|  |  |  | oldpattern will be preserved.  Variable parts in oldpattern | 
					
						
							|  |  |  | must occur in the same order in newpattern.  Variables parts | 
					
						
							|  |  |  | can be '?' and '*'. | 
					
						
							|  |  |  | Example:  | 
					
						
							|  |  |  | rename \"/tmp/foo*.ba.?\" \"/tmp/new*x?\" | 
					
						
							|  |  |  | All files in /tmp that match foo*.ba.? will have the \"foo\" part | 
					
						
							|  |  |  | replaced by \"new\" and the \".ba.\" part replaced by \"x\"." | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | usage="usage: $name [-htv] oldpattern newpattern" | 
					
						
							|  |  |  | name=${0##/} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | while getopts "htv" opt; do | 
					
						
							|  |  |  |     case "$opt" in | 
					
						
							|  |  |  |     t) tell=true;; | 
					
						
							|  |  |  |     v) verbose=true;; | 
					
						
							|  |  |  |     h) phelp; exit 0;; | 
					
						
							|  |  |  |     *) echo "$name: $usage" 1>&2; exit 2;; | 
					
						
							|  |  |  |     esac | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | shift $((OPTIND - 1)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ $# -lt 2 ]; then | 
					
						
							|  |  |  |     phelp | 
					
						
							|  |  |  |     exit 2 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | oldpat=$1 | 
					
						
							|  |  |  | newpat=$2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-17 21:46:59 +00:00
										 |  |  | set -- $1 | 
					
						
							|  |  |  | if [ ! -e "$1" ]; then | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |     echo "$name: no files match $oldpat." | 
					
						
							|  |  |  |     exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typeset -i i=1 j | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Example oldpat: foo*.a | 
					
						
							|  |  |  | # Example newpat: bar*.b | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Examples given for first iteration (in the example, the only interation) | 
					
						
							|  |  |  | while :; do | 
					
						
							|  |  |  |     case "$oldpat" in | 
					
						
							|  |  |  |     *[\*\?]*)	;; | 
					
						
							|  |  |  |     *)		break;; | 
					
						
							|  |  |  |     esac | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Get leftmost globbing pattern in oldpat | 
					
						
							|  |  |  |     pat=${oldpat#*[\*\?]}	# pat=.a | 
					
						
							|  |  |  |     pat=${oldpat%%"$pat"}	# pat=foo* | 
					
						
							|  |  |  |     pat=${pat##*[!\?\*]}	# pat=* | 
					
						
							|  |  |  |     # Find parts before & after pattern | 
					
						
							|  |  |  |     oldpre[i]=${oldpat%%"$pat"*}	# oldpre[1]=foo | 
					
						
							|  |  |  |     oldsuf[i]=${oldpat#*"$pat"}		# oldsuf[1]=.a | 
					
						
							|  |  |  |     newpre[i]=${newpat%%"$pat"*}	# newpre[1]=bar | 
					
						
							|  |  |  |     # Get rid of processed part of patterns | 
					
						
							|  |  |  |     oldpat=${oldpat#${oldpre[i]}"$pat"}	# oldpat=.a | 
					
						
							|  |  |  |     newpat=${newpat#${newpre[i]}"$pat"}	# newpat=.b | 
					
						
							|  |  |  |     let i=i+1 | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ $i -eq 1 ]; then | 
					
						
							| 
									
										
										
										
											2000-03-17 21:46:59 +00:00
										 |  |  |     echo "No globbing chars in pattern." 1>&2 | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |     exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | oldpre[i]=${oldpat%%"$pat"*}	# oldpre[2]=.a | 
					
						
							|  |  |  | oldsuf[i]=${oldpat#*"$pat"}	# oldsuf[2]=.a | 
					
						
							|  |  |  | newpre[i]=${newpat%%"$pat"*}	# newpre[2]=.b | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ -n "$verbose" ]; then | 
					
						
							|  |  |  |     j=1 | 
					
						
							|  |  |  |     while let "j < i"; do | 
					
						
							|  |  |  | 	echo \ | 
					
						
							|  |  |  | "Old prefix: ${oldpre[j]}   Old suffix: ${oldsuf[j]}   New prefix: ${newpre[j]}" | 
					
						
							|  |  |  | 	let j=j+1 | 
					
						
							|  |  |  |     done | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Example file: foox.a | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | for file; do | 
					
						
							|  |  |  |     j=1 | 
					
						
							|  |  |  |     origname=$file	# origname=foox.a | 
					
						
							|  |  |  |     newfile= | 
					
						
							|  |  |  |     while let "j <= i"; do | 
					
						
							|  |  |  | 	# Peel off a prefix	interation	1		2 | 
					
						
							|  |  |  | 	file=${file#${oldpre[j]}}		# file=x.a	file= | 
					
						
							|  |  |  | 	# Save the part of this prefix that is to be retained | 
					
						
							|  |  |  | 	const=${file%${oldsuf[j]}}		# const=x	const= | 
					
						
							|  |  |  | 	newfile=$newfile${newpre[j]}$const	# newfile=barx	newfile=barx.b | 
					
						
							|  |  |  | 	file=${file#$const}			# file=.a	file=.a | 
					
						
							|  |  |  | 	let j=j+1 | 
					
						
							|  |  |  |     done | 
					
						
							|  |  |  |     if [ -n "$tell" ]; then | 
					
						
							|  |  |  | 	echo "Would move \"$origname\" to \"$newfile\"." | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  | 	if [ -n "$verbose" ]; then | 
					
						
							|  |  |  | 	    echo "Moving \"$origname\" to \"$newfile\"." | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 	mv $origname $newfile | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | done |