Let’s say you have a directory with hundreds of files with the wrong file names, and you’d like to replace every filename containing test with prod. (this is a contrived example). We can easily do this with the “for” command in bash, combined with a little bit of bash goodness. Today we’ll learn how to replace text in a variable in a for loop.

The “for” command works like this:

for var in <files>;do <command> $var;done

You can replace <files> with any file match pattern, such as * or *.txt, and you can replace <command> with any linux command. The command will be run in sequence on each of the files matched by the file match pattern.

This is where the bash variable handling makes it even more interesting. Instead of just doing something like “mv $var”, we can replace text in the filename using this syntax:


So now, if we run this command on our directory:

for f in *;do mv $f ${f/test/prod};done

For each file matched by *, bash will execute a command similar to this:

mv test.config prod.config

I’ve found that knowledge of the shell is invaluable when administering servers or just for managing your file collection, and has saved me hours of what would have otherwise been manual work.

And yes, I realize there are a number of tools that can accomplish renaming of multiple files.

Profile Photo for Lowell Heddings Lowell Heddings
Lowell is the founder and CEO of How-To Geek. He’s been running the show since creating the site back in 2006. Over the last decade, Lowell has personally written more than 1000 articles which have been viewed by over 250 million people. Prior to starting How-To Geek, Lowell spent 15 years working in IT doing consulting, cybersecurity, database management, and programming work.
Read Full Bio »