質問:cp --no-target-directory
の使い方の簡単な例が必要です。
私はcp --no-target-directory
を理解するのにいくつかの困難を経験しています。 mv --no-target-directory
の説明 はわかりますが、cp
に使用する方法を想像することはできません。
たとえば、コマンド
mv /tmp/source /tmp/dest
が成功した場合、/tmp/source
が/tmp/dest
に名前が変更された保証はありません。他のプロセスが作成された場合、代わりに/tmp/dest/source
に名前が変更された可能性があります。/tmp/dest
をディレクトリとして。ただし、mv -T /tmp/source /tmp/dest
が成功した場合、/tmp/source was renamed to
/tmp/dest`は問題ありません。 ( ソース )
デフォルトでは、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'
次はどうですか?
$ cp -rvT Dir_1 Dir_2
‘Dir_1/File_3.txt’ -> ‘Dir_2/File_3.txt’
‘Dir_1/File_1.txt’ -> ‘Dir_2/File_1.txt’
‘Dir_1/File_2.txt’ -> ‘Dir_2/File_2.txt’
$ cp -rv Dir_1 Dir_2
‘Dir_1’ -> ‘Dir_2/Dir_1’
‘Dir_1/File_3.txt’ -> ‘Dir_2/Dir_1/File_3.txt’
‘Dir_1/File_1.txt’ -> ‘Dir_2/Dir_1/File_1.txt’
‘Dir_1/File_2.txt’ -> ‘Dir_2/Dir_1/File_2.txt’
そのため、cp Dir_1/* Dir_2/
を記述するための別の方法にすぎません。ただし、単純なcp *
では見逃されるDir_1のルートにある隠しファイルをキャッチします。
$ touch Dir_1/.Hidden_File_{1,2,3}.txt
$ cp -rv Dir_1/* Dir_2
cp: No match.
$ cp -rvT Dir_1 Dir_2
‘Dir_1/.Hidden_File_2.txt’ -> ‘Dir_2/.Hidden_File_2.txt’
‘Dir_1/.Hidden_File_3.txt’ -> ‘Dir_2/.Hidden_File_3.txt’
‘Dir_1/.Hidden_File_1.txt’ -> ‘Dir_2/.Hidden_File_1.txt’