cp -rの構文の違いとそれを克服する方法

cp -rの構文の違いとそれを克服する方法

私たちが空のディレクトリにあるとしましょう。次に、次のコマンドを実行します。

mkdir dir1
cp -r dir1 dir2

2つの(空の)ディレクトリdir1dir2そのコピーが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 dir2dir2すでに存在する場合)既存のアイテム(およびすべてのコンテンツ)を削除しdir2てそれを置き換えることを期待します。これはdir1、両方のファイルで使用した場合の動作であるためです。cpLinux(より一般的には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の内容をコピーすることです(既存のファイルは維持されます)。/dir1dir2dir1dir2dir2

$ 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 dir22番目の引数の暗黙的な評価が期待されます。

  • 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

関連情報