If you use the command line (shell) in Ubuntu a lot,
like me, you probably are aware of the -p
option of the mkdir
command to create
all directories in the given (relative) path that
do not already exist.
For example, assuming that the Downloads directory doesn't exists, the following command:
mkdir -p /home/john/Downloads/web
Creates both the Downloads
directory and its subdirectory
web
.
If the Downloads
directory does exists - and
even the web
subdirectory - no error is given; the
mkdir command just ignores each directory that already exists.
Hence it's safe to use this command: no files will be deleted if
the directory already exists.
But you can do much more using the -p
option; you
can create a complete directory tree with just a single command.
The power of the -p
option is not limited to creating
all non-existent directories in a path; you can create a complete
directory tree with a single mkdir
command.
First let start with a simple example: assume that besides the web subdirectory, which I use as the default download directory for Firefox, also a directory for active torrents and finished torrents is required. Or drawn as a tree using ASCII art:
Downloads
|
+-----------------+-------------+
| | |
active-torrents finished-torrents web
This directory tree can be created using the following
mkdir
command:
mkdir -p Downloads/{active-torrents,finished-torrents,web}
Note how the directories at the same level are grouped between {} and separated by commas.
Note: don't be tempted to put a
space after each comma, otherwise you end up with
a {active-torrents,
sub directory in
Downloads
, and with a
finished-torrents,
and
web}
directory at the same level as
Downloads
because a space is seen as
an argument separator. Or: what follows the space
is seen as the start of a entirely new path.
For a more complex example, the following directory tree:
johnbokma.com
|
+---------+--------+
| | |
branches tags trunk
|
+--------+--------+
| | |
cgi-bin htdocs scripts
can be created with the following command:
mkdir -p johnbokma.com/{branches,tags,trunk/{cgi-bin,htdocs,scripts}}
If you are using Subversion to keep files under version control you might recognize the directory tree structure.
Note how again {} is used to group a set of directories, and that an element in a set can consist of a directory followed by another set.