Brace yourself

August 18, 2009

linux

The shell (in this case bash) is packed with features. So much so that you will probably never ever learn them all. Brace expansion is one of those things.

What is it? In the bash manual it says:

Brace Expansion

Brace expansion is a mechanism by which arbitrary strings may be generated. This mechanism is similar to pathname expansion, but the filenames generated need not exist

So what is it? You can make your shell generate strings, like so:

$ echo {one,two}
one two

Or, somewhat more useful

$ echo prefix_{one,two}
prefix_one prefix_two

Or

$ echo prefix{,two}
prefix prefixtwo

Or

$ echo {1..4}
1 2 3 4

Think of it as sort of a pathname expansion, but the filenames do not have to exist.

More down to the earth examples include: moving a file to the same name, but then with .bak added.

Cumbersome way:

$ mv mylongfilename mylongfilename.bak

Or

$ mv mylongfilename{,.bak}

Which first generates nothing, and leaves mylongfilename and a mylongfilename with .bak appended.

With this you can create neat little scripts, like the following one, which I use for archiving my E-mail. I’m especially fond of the

rmdir ~/Mailback/$BCK/{old,sent}/{new,tmp}

CODE(sh){ #!/bin/bash

Archive Maildir format

Move the directory ~/Maildir/.old/* to ~/Mailback/YYYY-MMM

crawl the directories and bzip2 everything

BCK=“$(date +%Y)-$(date +%b)” mkdir -p ~/Mailback/$BCK/{old,sent}

mv ~/Maildir/.old/* ~/Mailback/$BCK/old
mv ~/Maildir/.sent/* ~/Mailback/$BCK/sent rmdir ~/Maildir/.{old,sent} # mutt will recreate them

new and tmp should be empty

rmdir ~/Mailback/$BCK/{old,sent}/{new,tmp}

now bzip2’em

( cd ~/Mailback/$BCK/old/cur; ls | xargs bzip2 -7 ) ( cd ~/Mailback/$BCK/sent/cur; ls | xargs bzip2 -7 ) }CODE

None