sandra_henrystocker
Unix Dweeb

Making good use of brace expansion

How-To
Mar 12, 20153 mins

Brace expansion seems to be one of the shell tricks that lots of people overlook. It can come in very handy when you need to generate strings. Say you want to create a backup directory for each day of the work week, you might do it like this:

$ mkdir backup.{mon,tue,wed,thu,fri}
$ ls -ld backup*
drwxr-x--- 2 shs staff 4096 Mar 12 2015 backup.fri
drwxr-x--- 2 shs staff 4096 Mar 12 2015 backup.mon
drwxr-x--- 2 shs staff 4096 Mar 12 2015 backup.thu
drwxr-x--- 2 shs staff 4096 Mar 12 2015 backup.tue
drwxr-x--- 2 shs staff 4096 Mar 12 2015 backup.wed

The expansion matches up the text outside of the braces with each of the strings separated by commas within the braces. And, of course, you can remove the directories just as easily with rmdir backup.{mon,tue,wed,thu,fri} or with $ rm -rf backup.{mon,tue,wed,thu,fri} if you’ve put files in them.

If you want to list only the most recent three rotated messages files, you can use the expression {1..3} to select only the messages files that end in 1, 2, or 3.

$ ls -l /var/log/messages.{1..3}
-rw------- 1 root root 14070 Mar  7 22:49 /var/log/messages.1
-rw------- 1 root root 41984 Mar  1 00:17 /var/log/messages.2
-rw------- 1 root root 34717 Feb 21 23:04 /var/log/messages.3

You can use brace expansion multiple times in a command if you like. Both of the {a..z} expressions in this command runs through all 26 letters in the alphabet so you end up with a list of strings that run from aa to zz.

$ echo {a..z}{a..z}
aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au
av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp
bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck
cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df
dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea
eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev
ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq
...

This may not be something you do every day, but it will save you a lot of time whenever you need to generate a pile of strings given a particular pattern. You might be surprised how often it turns out to be a very handy trick.

sandra_henrystocker

Sandra Henry-Stocker was a programmer, Linux systems administrator, security engineer and Linux journalist for most of her 30-year career. She describes herself as "USL" (Unix as a second language) but remembers enough English to write books and buy groceries. She lives in the mountains in Virginia where, when not working with or writing about Unix, she's chasing the bears away from her bird feeders. Tune into her 2-Minute Linux video tutorials and take command of your command line.

More from this author