122 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#! /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
 | 
						|
 | 
						|
set -- $1
 | 
						|
if [ ! -e "$1" ]; then
 | 
						|
    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
 | 
						|
    echo "No globbing chars in pattern." 1>&2
 | 
						|
    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
 |