デフォルトでcpは、最後の引数が既存のディレクトリかどうかをテストします。これが発生した場合cp、ソースのベース名を使用して、そのディレクトリ内にリンクを作成します。つまり、コマンド
cp foo/bar wibble
場合はwibble、次に既存のディレクトリでcpコピーするソースがwibble/bar。wibbleが存在しない場合はcp、ソースをにリンクしますwibble。
コピーが常にwibbleであることを確認したい場合は、--no-target-directory(エイリアス-T)オプションを指定できます。そうすれば、cp成功した場合、コピーが確実に呼び出されwibbleます。wibbleディレクトリとしてすでに存在する場合、cp失敗します。
表形式で:
The target is … Without -T With -T
existing directory copy in the directory error
existing file (not dir) overwrite overwrite
does not exist create create
唯一の違いは-T、では、ターゲットが既存のディレクトリの場合、コマンドがエラーを返すことです。これは、ディレクトリが存在しないことが予想される場合に役立ちます。予期しないことが発生する代わりに、エラーメッセージが表示されます。
同じことが、にも適用されるmvとln。ターゲットがのある既存のディレクトリである場合-T、それらは暗黙のうちに別のことをするのではなく、エラーを通知します。
ではcp、別のケースがあります。再帰的なコピーを行い、ソースがディレクトリのcp -T場合、ソース自体をコピーするのではなく、ソースのコンテンツを宛先にコピーします。つまり、
$ tree source destination
source
└── foo
destination
└── bar
その後
$ cp -rv source destination
`source' -> `destination/source'
`source/foo' -> `destination/source/foo'
一方
% cp -rvT source destination
`source/foo' -> `destination/foo'
--no-target-directoryオプションで機能します。--recursiveを使用している限り、すべてが問題ありません([coreutils 8.12GNU / Linuxで]を使用)。主な違いは--no-target-directory、コンテンツではなくディレクトリ自体がコピーされることです[研究はまだ進行中]