Target directory
================
Some GNU programs (at least `cp', `install', `ln', and `mv') allow
you to specify the target directory via this option:
`--target-directory=DIRECTORY'
Specify the destination DIRECTORY.
The interface for most programs is that after processing options
and a finite (possibly zero) number of fixed-position arguments,
the remaining argument list is either expected to be empty, or is
a list of items (usually files) that will all be handled
identically. The `xargs' program is designed to work well with
this convention.
The commands in the `mv'-family are unusual in that they take a
variable number of arguments with a special case at the _end_
(namely, the target directory). This makes it nontrivial to
perform some operations, e.g., "move all files from here to
../d/", because `mv * ../d/' might exhaust the argument space, and
`ls | xargs ...' doesn't have a clean way to specify an extra
final argument for each invocation of the subject command. (It
can be done by going through a shell command, but that requires
more human labor and brain power than it should.)
The `--target-directory' option allows the `cp', `install', `ln',
and `mv' programs to be used conveniently with `xargs'. For
example, you can move the files from the current directory to a
sibling directory, `d' like this: (However, this doesn't move
files whose names begin with `.'.)
ls |xargs mv --target-directory=../d
If you use the GNU `find' program, you can move _all_ files with
this command:
find . -mindepth 1 -maxdepth 1 \
| xargs mv --target-directory=../d
But that will fail if there are no files in the current directory
or if any file has a name containing a newline character. The
following example removes those limitations and requires both GNU
`find' and GNU `xargs':
find . -mindepth 1 -maxdepth 1 -print0 \
| xargs --null --no-run-if-empty \
mv --target-directory=../d