パラレルディレクトリのコピーcp -rはなぜこのように動作しますか?

パラレルディレクトリのコピーcp -rはなぜこのように動作しますか?

次はうまくいきます(つまり、私が望むことを行います)。

 cd /var/www/release/
 mkdir wiki
 cp -rp ../html/wiki ./

しかし、これを行うと(より直感的なようです)

 cp -r ../html/wiki ./wiki

/var/www/release/wiki/wikiを作成します(決して望ましくありません)。

この動作はmvと同じです。誰かがこの行動の裏側にある論理を説明して、後で最初から正しく実行できることを願っています。

答え1

SOURCEディレクトリ全体をコピーするには、ディレクトリをどこに保存する必要があるかを知りcpたいです。DESTINATION

あなたが犯した間違いは、/var/www/release/wikiテスト後にディレクトリを削除していないことです。mkdircp -rp ...

cp -r ...命令した作業も../html/wiki同様です。既存のディレクトリを作成./wikiし、という名前の別のディレクトリを作成しますwiki

削除してから/var/www/release/wikiコマンドcp -rを再実行すると、期待どおりに機能することがわかります。

答え2

cpそして3つの形式があります。mv

cp/mv [OPTION]... [-T] SOURCE DEST
cp/mv [OPTION]... SOURCE... DIRECTORY
cp/mv [OPTION]... -t DIRECTORY SOURCE...

フォーム1とフォーム2はフォーマットcp/mv a bで、フォーム2bは既存のディレクトリですが、フォーム1bはターゲットです。これらのあいまいさを避けるために、フォーム2を使用しないでください。フォーム1を使用して実行したい操作を完了し、を使用します-T。既存のディレクトリに移動またはコピーするには、フォーム3を使用してください。

答え3

最後の引数がcp既存のディレクトリの場合、cpソースファイルはそのディレクトリにコピーされます。mv同じことをしてください。

ソースディレクトリをターゲットディレクトリとマージしようとしています。ただし、これはソースがディレクトリの場合にのみ意味があります。cp somefile existing-directory/したがって、実行すると、existing-directory/somefilecp -r somedir existing-directory/existing-directory/somedircpcp -r somefile somedir existing-directory/existing-directory/somefileexisting-directory/somedir

cp something existing-directoryソースファイルをターゲットディレクトリにコピーします。ソースがディレクトリであり、その内容をコピーするには、次のようにします。

cp -rp something/* existing-directory/

省略されているので参考にしてくださいaで始まる名前のファイル.。これを含めるには、次の方法を使用する簡単な方法がありますrsync

rsync -a something/ existing-directory/

の場合、ソースの末尾にrsyncを配置すると、ソースの内容がターゲットディレクトリにコピーされます。ソースが後ろにない/場合、/ソースはターゲットディレクトリにエントリとして作成されます。

関連情報