1 | #! /bin/bash
|
---|
2 | #
|
---|
3 | # original from:
|
---|
4 | # @(#) rename.ksh 1.1 94/05/10
|
---|
5 | # 90/06/01 John DuBois (spcecdt@armory.com)
|
---|
6 | # 91/02/25 Improved help info
|
---|
7 | # 92/06/07 remove quotes from around shell pattern as required by new ksh
|
---|
8 | # 94/05/10 Exit if no globbing chars given.
|
---|
9 | #
|
---|
10 | # conversion to bash v2 syntax by Chet Ramey
|
---|
11 |
|
---|
12 | phelp()
|
---|
13 | {
|
---|
14 | echo "$usage
|
---|
15 | All files that match oldpattern will be renamed with the
|
---|
16 | filename components that match the constant parts of oldpattern
|
---|
17 | changed to the corresponding constant parts of newpattern.
|
---|
18 | The components of the filename that match variable parts of
|
---|
19 | oldpattern will be preserved. Variable parts in oldpattern
|
---|
20 | must occur in the same order in newpattern. Variables parts
|
---|
21 | can be '?' and '*'.
|
---|
22 | Example:
|
---|
23 | rename \"/tmp/foo*.ba.?\" \"/tmp/new*x?\"
|
---|
24 | All files in /tmp that match foo*.ba.? will have the \"foo\" part
|
---|
25 | replaced by \"new\" and the \".ba.\" part replaced by \"x\"."
|
---|
26 | }
|
---|
27 |
|
---|
28 | usage="usage: $name [-htv] oldpattern newpattern"
|
---|
29 | name=${0##/}
|
---|
30 |
|
---|
31 | while getopts "htv" opt; do
|
---|
32 | case "$opt" in
|
---|
33 | t) tell=true;;
|
---|
34 | v) verbose=true;;
|
---|
35 | h) phelp; exit 0;;
|
---|
36 | *) echo "$name: $usage" 1>&2; exit 2;;
|
---|
37 | esac
|
---|
38 | done
|
---|
39 | shift $((OPTIND - 1))
|
---|
40 |
|
---|
41 | if [ $# -lt 2 ]; then
|
---|
42 | phelp
|
---|
43 | exit 2
|
---|
44 | fi
|
---|
45 |
|
---|
46 | oldpat=$1
|
---|
47 | newpat=$2
|
---|
48 |
|
---|
49 | set -- $1
|
---|
50 | if [ ! -e "$1" ]; then
|
---|
51 | echo "$name: no files match $oldpat."
|
---|
52 | exit 1
|
---|
53 | fi
|
---|
54 |
|
---|
55 | typeset -i i=1 j
|
---|
56 |
|
---|
57 | # Example oldpat: foo*.a
|
---|
58 | # Example newpat: bar*.b
|
---|
59 |
|
---|
60 | # Examples given for first iteration (in the example, the only interation)
|
---|
61 | while :; do
|
---|
62 | case "$oldpat" in
|
---|
63 | *[\*\?]*) ;;
|
---|
64 | *) break;;
|
---|
65 | esac
|
---|
66 |
|
---|
67 | # Get leftmost globbing pattern in oldpat
|
---|
68 | pat=${oldpat#*[\*\?]} # pat=.a
|
---|
69 | pat=${oldpat%%"$pat"} # pat=foo*
|
---|
70 | pat=${pat##*[!\?\*]} # pat=*
|
---|
71 | # Find parts before & after pattern
|
---|
72 | oldpre[i]=${oldpat%%"$pat"*} # oldpre[1]=foo
|
---|
73 | oldsuf[i]=${oldpat#*"$pat"} # oldsuf[1]=.a
|
---|
74 | newpre[i]=${newpat%%"$pat"*} # newpre[1]=bar
|
---|
75 | # Get rid of processed part of patterns
|
---|
76 | oldpat=${oldpat#${oldpre[i]}"$pat"} # oldpat=.a
|
---|
77 | newpat=${newpat#${newpre[i]}"$pat"} # newpat=.b
|
---|
78 | let i=i+1
|
---|
79 | done
|
---|
80 |
|
---|
81 | if [ $i -eq 1 ]; then
|
---|
82 | echo "No globbing chars in pattern." 1>&2
|
---|
83 | exit 1
|
---|
84 | fi
|
---|
85 |
|
---|
86 | oldpre[i]=${oldpat%%"$pat"*} # oldpre[2]=.a
|
---|
87 | oldsuf[i]=${oldpat#*"$pat"} # oldsuf[2]=.a
|
---|
88 | newpre[i]=${newpat%%"$pat"*} # newpre[2]=.b
|
---|
89 |
|
---|
90 | if [ -n "$verbose" ]; then
|
---|
91 | j=1
|
---|
92 | while let "j < i"; do
|
---|
93 | echo \
|
---|
94 | "Old prefix: ${oldpre[j]} Old suffix: ${oldsuf[j]} New prefix: ${newpre[j]}"
|
---|
95 | let j=j+1
|
---|
96 | done
|
---|
97 | fi
|
---|
98 |
|
---|
99 | # Example file: foox.a
|
---|
100 |
|
---|
101 | for file; do
|
---|
102 | j=1
|
---|
103 | origname=$file # origname=foox.a
|
---|
104 | newfile=
|
---|
105 | while let "j <= i"; do
|
---|
106 | # Peel off a prefix interation 1 2
|
---|
107 | file=${file#${oldpre[j]}} # file=x.a file=
|
---|
108 | # Save the part of this prefix that is to be retained
|
---|
109 | const=${file%${oldsuf[j]}} # const=x const=
|
---|
110 | newfile=$newfile${newpre[j]}$const # newfile=barx newfile=barx.b
|
---|
111 | file=${file#$const} # file=.a file=.a
|
---|
112 | let j=j+1
|
---|
113 | done
|
---|
114 | if [ -n "$tell" ]; then
|
---|
115 | echo "Would move \"$origname\" to \"$newfile\"."
|
---|
116 | else
|
---|
117 | if [ -n "$verbose" ]; then
|
---|
118 | echo "Moving \"$origname\" to \"$newfile\"."
|
---|
119 | fi
|
---|
120 | mv $origname $newfile
|
---|
121 | fi
|
---|
122 | done
|
---|