+You probably noticed that all the output files appear in the same
+directory. You might prefer that each file appears in its own
+directory. This will show you how to do that.
+
+Unlike shell scripts, in CWL you cannot call `mkdir` and `mv` to
+organize files into directories. This is because the output files, at
+this point, do not actually exist together in one directory. They may
+exist on different nodes, in different directories, or different cloud
+buckets. In CWL, instead of moving files around directly, you tell
+the runner you want your directory to look like, and it will create it
+for you.
+
+We can use an "expression" to create a `Directory` object describing
+each of our directories. An expression is a piece of Javascript code
+which is executed by the workflow runner to produce values that affect
+the workflow. These can be a simple as substituting the value of an
+input variable, or as complex as en entire function that generates new
+objects.
+
+Javscript code must be bracketed inside `$(...)` or `${...}`. The
+difference comes down to syntax. The `$()` form is more compact but
+can only include code that can appear on the right side of an
+assignment (`=`), which cannot include control blocks like `if` or
+`for`. The `${}` form is a Javascript function, which can include
+control blocks, and must end in a `return` statement.
+
+Dxpressions can both appear in `valueFrom` fields as well as some
+other fields, or in an `ExpressionTool` which, like `Workflow` or
+`CommandLineTool` has explicitly defined `inputs` and `outputs`
+sections.
+
+The approach here is to define an expression tool which takes a
+
+The `Directory` object has two fields, `basename` and `listing`. The
+`basename` is the name of the directory, and the `listing` is the
+contents, which consists of other File and Directory objects.