Bash Brace Expansion Tutorial




Bash brace expansion is an incredibly valuable feature once you commit it to memory and begin using it on a regular basis. It will save you immense amounts of typing. This also works in Zsh.

How it works

When you provides a set of braces {} with comma-separated values inside, Bash will expand each one into a separate argument.

The simple example to demonstrate this is using echo like this:

echo Hello {Jack,Jill,Bill}
# Outputs: Hello Jack Jill Bill

echo Hello Ja{ke,net,cob,red}
# Outputs: Hello Jake Janet Jacob Jared

echo Hello S{u,uzann,uzi}e
# Outputs: Hello Sue Suzanne Suzie

echo Hello {J,K,T}immy
# Outputs: Hello Jimmy Kimmy Timmy

The brace expansion will take the current word that the braces are in, and expand it to create a unique word for each value inside the braces.

You can also have it auto increment numbers and characters. For example

echo {1..10}
# Outputs: 1 2 3 4 5 6 7 8 9 10

echo {1..10..2}  # Increment by 2 each time
# Outputs: 1 3 5 7 9

echo {a..e}
# Outputs: a b c d e

echo {a..z..2}  # a through z incrementing by 2 each time
# Outputs: a c e g i k m o q s u w y

echo {A..z..2}  # Capital letters come before lowercase in ASCII
# Outputs: A C E G I K M O Q S U W Y [ ] _ a c e g i k m o q s u w y

Practical examples

Here are a few practical examples of how I use brace expansion regularly.

Changing a file extension

# Change a .txt to a .md
mv myfile.{txt,md}

Rename directory for backup

# Add .backup to a directory name
mv /my/directory{,.backup}

Installing similarly named packages

# Installs Java JRE + JDK + JavaFX on Fedora
sudo yum install java-1.8.0-openjdk{,-devel,-openjfx}

# Install multiple PHP packages on Ubuntu
sudo apt install php-{common,mbstring,mysql}

Make several directories at once

mkdir -p $HOME/my_new_project/{src,docs,build}


You should have a basic understanding of how Bash brace expansion works and how you can apply it to some common tasks. What other kind of uses can you think of?