以下工作正常(即做我想要的)
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
后没有删除目录。mkdir
cp -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 放在/
源的末尾,则源的内容将复制到目标目录中。如果/
源没有尾随,源将被创建为目标目录中的条目。