質問:の使い方を示すために簡単な例が必要です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/dest
mv -T /tmp/source /tmp/dest
/tmp/source was renamed to
源泉)
答え1
デフォルトでは、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'
答え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’