cp --no-target-directory 説明

cp --no-target-directory 説明

質問:の使い方を示すために簡単な例が必要ですcp --no-target-directory

私はそれを理解するのに少し苦労しましたcp --no-target-directory。わかりました。説明mv --no-target-directoryしかし、私はそれを使用する方法を本当に想像することはできませんcp

たとえば、コマンドがmv /tmp/source /tmp/dest成功しても名前が次に変更されるという保証はありません/tmp/source。別のプロセスでディレクトリを作成した場合は、名前が/tmp/dest変更された可能性があります。しかし、成功すれば/tmp/dest`は問題になりません。 (/tmp/dest/source/tmp/destmv -T /tmp/source /tmp/dest/tmp/source was renamed to源泉)

答え1

デフォルトでは、cp最後の引数が既存のディレクトリであるかどうかをテストします。これが発生すると、cpそのディレクトリ内にソースのデフォルト名を含むリンクが生成されます。つまり、コマンドが与えられると

cp foo/bar wibble

wibble存在する場合は、cpソースをディレクトリにコピーしますwibble/barwibble存在しない場合は、cpソースをディレクトリにリンクしますwibble

コピーを常に使用できるようにするには、(エイリアス)オプションをwibble指定できます。これにより、成功した場合にコピーが呼び出されたことを確認できます。すでにディレクトリとして存在すると失敗します。--no-target-directory-Tcpwibblewibblecp

表形式:

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'

答え2

--no-target-directoryソースディレクトリをコピーしたくない場合は、次のものを使用できます。下にソースディレクトリをコピーする既存のターゲットディレクトリ到着ターゲットディレクトリ。

以下は、含めるかどうかに応じたディレクトリコピーの例です--no-target-directory

$ mkdir a
$ touch a/b a/c
$ find
.
./a
./a/c
./a/b
$ cp -r a b       # b does not exist; becomes copy of a
$ find
.
./b
./b/b
./b/c
./a
./a/c
./a/b
$ rm -r b
$ mkdir b
$ cp -r a b       # b already exists; a is copied *underneath* it
$ find
.
./b
./b/a
./b/a/b
./b/a/c
./a
./a/c
./a/b
$ rm -r b
$ mkdir b
$ cp -r --no-target-directory a b     # b already exists; becomes copy of a
$ find
.
./b
./b/b
./b/c
./a
./a/c
./a/b

/.次のようにソースディレクトリ名の後にスラッシュポイントを追加すると、同じ効果が得られます。cp -r a/. bソースディレクトリのコピーa 到着 bまさか下に b

上記の両方の方法は、「元のディレクトリの内容を既存の宛先ディレクトリにコピーするだけ」とは異なります。これは、保存する時間と権限を要求すると、既存のターゲットディレクトリがソースディレクトリの時間と権限を取得するためです。はい(不要な情報を削除するように編集されています):

$ find . -ls
drwx------   Oct 13 13:31 ./b         # note date and permissions
drwxr-xr-x   Jan  1  2013 ./a         # note date and permissions
-rw-r--r--   Oct 13 13:23 ./a/c
-rw-r--r--   Oct 13 13:23 ./a/b
$ cp -rp --no-target-directory a b    # preserve mode and timestamps
$ find . -ls
drwxr-xr-x   Jan  1  2013 ./b         # note copied date and permissions
-rw-r--r--   Oct 13 13:23 ./b/b
-rw-r--r--   Oct 13 13:23 ./b/c
drwxr-xr-x   Jan  1  2013 ./a
-rw-r--r--   Oct 13 13:23 ./a/c
-rw-r--r--   Oct 13 13:23 ./a/b

コンテンツ専用コピーは、ソースディレクトリのスキーマまたはタイムスタンプをターゲットディレクトリに転送しません。

答え3

以下はどうですか?

$ 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/。ただし、Dir_1のルートディレクトリにある隠しファイルをキャプチャしますが、単純ですcp *

$ 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’

関連情報