私たちが空のディレクトリにあるとしましょう。次に、次のコマンドを実行します。
mkdir dir1
cp -r dir1 dir2
2つの(空の)ディレクトリdir1
とdir2
そのコピーがdir2
作成されますdir1
。しかし、これを行うと:
mkdir dir1
mkdir dir2
cp -r dir1 dir2
それから私達はdir1
それが今内部に置かれていることを発見しましたdir2
。これは意味する同じcp
コマンドは、ターゲットディレクトリが存在するかどうかによって異なります。。その場合、cp
コマンドは同じことを行います。
mkdir dir1
mkdir dir2
cp -r dir1 dir2/.
これは私にとって非常に反直感的なようです。cp -r dir1 dir2
(dir2
すでに存在する場合)既存のアイテム(およびすべてのコンテンツ)を削除しdir2
てそれを置き換えることを期待します。これはdir1
、両方のファイルで使用した場合の動作であるためです。cp
Linux(より一般的にはUnixファミリーシステム)にディレクトリが存在する方法のため、再帰コピー自体が少し異なることを知っていますが、より多くの説明を探しています。なぜこの動作が選択されました。私が期待どおりに機能しているかどうかを確認する方法を教えてください。cp
ボーナスポイントになります(事前にターゲットディレクトリをテストして削除せずに)。いくつかのオプションを試しましたが、cp
運がありませんでした。rsync
命令を知らない他の人のための解決策を受け入れるようです。
この動作が普遍的でない場合は、CentOSでbashを使用しています。
答え1
あなたが探している行動は特別な場合:
cp -R [-H|-L|-P] [-fip] source_file... target
[This] 形式は、-R オプションを指定した 2 つ以上のオペランドで表されます。 cpユーティリティは、各source_fileのファイル階層内の各ファイルを次の名前の宛先パスにコピーする必要があります。
- targetが存在し、既存のディレクトリの名前を指定する場合、ファイル階層内の各ファイルに対応するターゲットパス名は、target、単一
<slash>
文字(targetで終わらない場合<slash>
)、およびそのディレクトリへのファイルパス名の関連付けでなければなりません。 。 source_fileを含むディレクトリ。- targetが存在せず、2つのオペランドが指定されている場合、source_fileに対応するターゲットパス名はtargetです。ファイル階層内の他のすべてのファイルの対応する宛先パス名は、
<slash>
source_fileと比較した宛先、文字、およびファイルパス名です。シリーズ。ターゲットが存在せず、オペランドが2つ以上指定されているとエラーが発生します。
cp
だから私はあなたが望むことをすることは不可能であると言いたいと思います。
予想される動作は「cp -r dir1 dir2
(dir2
既に存在する場合)なので、既存dir2
(およびすべてのコンテンツ)は削除されていますdir1
」:
rm -rf dir2 && cp -r dir1 dir2
存在することを確認する必要もありませんdir2
。
解決策は、ソースに末尾を追加してrsync
ソース自体をコピーせずにtoの内容をコピーすることです(既存のファイルは維持されます)。/
dir1
dir2
dir1
dir2
dir2
$ tree dir*
dir1
└── test.txt
dir2
└── test2.txt
0 directories, 2 file
$ rsync -a dir1/ dir2
$ tree dir*
dir1
└── test.txt
dir2
└── test.txt
└── test2.txt
0 directories, 3 files
$ rm -r dir2
$ rsync -a dir1/ dir2
$ tree dir*
dir1
└── test.txt
dir2
└── test.txt
0 directories, 2 files
答え2
cpにはいくつかの形式があります。
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
これにより、cp -r dir1 dir2
2番目の引数の暗黙的な評価が期待されます。
- 2番目の引数がファイルシステムに存在しない名前の場合、cpはそれをDESTとして解釈して生成します。 copyind dir1〜のように目次 2.
- すでに存在する場合は、ディレクトリとして解釈され、dir1がコピーされます。入力するそれ。
初期状態がわからず、複数の解釈の可能性を回避するには、次のオプションを使用して簡単に明示的に作成できます-T
。
$ tree dir*
dir1
└── test.txt
dir2
└── test2.txt
0 directories, 2 file
$ cp -r dir1 -T dir2
$ tree dir*
dir1
└── test.txt
dir2
└── test.txt
0 directories, 3 files
$ rm -r dir2
$ cp -r dir1 -T dir2
$ tree dir*
dir1
└── test.txt
dir2
└── test.txt
0 directories, 2 files