复制并行目录 为什么 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

如果您想将整个目录复制为SOURCEcp想要一个目录为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/somefile;当你运行时,cp -r somedir existing-directory/你最终会得到existing-directory/somedir.您认为直观的行为(但我不这么认为)将要求cp根据源是否是目录而有所不同,因此cp -r somefile somedir existing-directory/将 createexisting-directory/somefile但不是existing-directory/somedir.

cp something existing-directory将源文件复制到目标目录中。如果源是一个目录并且您想要复制其内容,请运行

cp -rp something/* existing-directory/

请注意,这省略了名称以 a 开头的文件.。如果你想包含它们,一个简单的方法是使用rsync

rsync -a something/ existing-directory/

对于rsync,如果将 a 放在/源的末尾,则源的内容将复制到目标目录中。如果/源没有尾随,源将被创建为目标目录中的条目。

相关内容