Shell parameter expansion provides various ways to manipulate strings, and a convenient way to succinctly express renaming a set of files.
In its simplest form, parameter expansion is simply ${parameter}. But look at these examples:
$ mystr="TheQuickBrownFox.jpg" # chop off last 4 digits $ echo ${mystr:0:-4} TheQuickBrownFox # truncate end of string '.jpg' $ echo ${mystr%.jpg} TheQuickBrownFox # replace 'Fox' with 'Wolf' $ echo ${mystr/Fox/Wolf} TheQuickBrownWolf.jpg # strips starting with 'Q' and stopping at 'ck' $ echo ${mystr/Q*ck/} TheBrownFox.jpg
Armed with string expansion, let’s create a set of files that follows the pattern “index-X.temp.html”.
$ for i in $(seq 1 3); do touch index-$i.temp.html; done $ ls *.html index-1.temp.html index-2.temp.html index-3.temp.html
And now rename the files in this directory to instead use the pattern “default-X.htm”
$ or orig in $(ls *.html);do newname=${orig/index/default}; mv $orig ${newname%.temp.html}.htm; done $ ls *.htm default-1.htm default-2.htm default-3.htm
Notice the intermediate variable to do the first replacement of ‘index’ with ‘default’. Then the suffix truncation starting with ‘.temp.html’.
REFERENCES
gnu.org, shell parameter expansion
stackoverflow, rename multiple files
cyberciti, bash shell param substitution like a pro
devhints.io, parameter expansion cheat sheet
NOTES
Extracting filename from full file path
$ for fullpath in $(find . | xargs realpath); do echo ${fullpath##*/}; done tmp default-1.htm default-2.htm default-3.htm
Excluding name from full file path
$ for fullpath in $(find . | xargs realpath); do echo ${fullpath%/*}; done /home/fabian /home/fabian/tmp /home/fabian/tmp /home/fabian/tmp
Only filename part of URL
$ url="https://fabianlee.org/downloads/test-1.2.3.gz" && echo ${url##*/} test-1.2.3.gz
Only base URL part
$ url="https://fabianlee.org/downloads/test-1.2.3.gz" && echo ${url%/*} https://fabianlee.org/downloads
Parameter expansion for replacement
# some versions of wget do not like no_proxy domains # being prefixed with "." # curl does not have this issue export http_proxy=http://mysquid:3128 export https_proxy=$http_proxy export no_proxy=127.0.0.1,localhost,.foo.com,.bar.com # replace all ",." with just comma to get rid of period no_proxy=${no_proxy//,./,} wget https://mydomain.foo.com
replacing dash with period
FULL_ID="mysubdomain-maindomain-com" # replace just first dash echo ${FULL_ID/-/.} # replace all dashes echo ${FULL_ID//-/.}
replacing period with dash
ISTIO_VERSION=1.7.5 # single forward slash would mean only replace one ISTIO_VERSION_HYPHENATED=${ISTIO_VERSION//\./\-}
removing whitespace
# remove leading whitespace output="${output##*( )}" # remove trailing whitespace output="${output%%*( )}"