デフォルトで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.12
GNU / Linuxで]を使用)。主な違いは--no-target-directory
、コンテンツではなくディレクトリ自体がコピーされることです[研究はまだ進行中]