Upload Tizen:Base source
[external/bash.git] / examples / scripts.v2 / rename
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