# Brace yourself


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

