cp -r和cp -R之间的区别(复制命令)


60

cp -r用于递归复制文件,以及cp -R递归复制目录。但是我检查了一下,两者似乎都复制了文件和目录,都是一样的。那么,实际上有什么区别?


2
Linux手册中对这些选项的每次提及都表示它们是同义词。(它们不在其他某些Unix变体上。)
Gilles

Answers:


74

虽然-Rposix定义明确,但-r不可移植!

在Linux中的GNU和BusyBox的实现cp-r并且-R是等价的。

另一方面,您可以在的POSIX手册页中阅读cp-r行为是由实现定义的

    * If  neither  the  -R  nor  -r  options were specified, cp shall take
      actions based on the type and contents of the file referenced by the
      symbolic link, and not by the symbolic link itself.

    * If the -R option was specified:

       * If  none  of  the  options  -H,  -L, nor -P were specified, it is
         unspecified which of -H, -L, or -P will be used as a default.

       * If the -H option was specified, cp shall take  actions based on
         the type and contents of the file referenced by any symbolic link
         specified as a source_file operand.

       * If the -L option was specified, cp shall take  actions based  on
         the type and contents of the file referenced by any symbolic link
         specified as a source_file operand or any symbolic links encoun-
         tered during traversal of a file hierarchy.

       * If  the  -P option was specified, cp shall copy any symbolic link
         specified as a source_file operand and any symbolic links encoun-
         tered  during traversal of a file hierarchy, and shall not follow
         any symbolic links.

    * If the -r option was  specified,  the  behavior  is implementation-
      defined.

14
差异之一是,例如在OSX中,-r将复制符号链接所指向的实际文件,而-R将复制符号链接,这在大多数情况下是需要的。
nacho4d

19

区别在于,一个使用小写的“ R”,另一个使用大写的“ R”。除此之外,没有区别。如果使用--recursivelong选项,则相同。


4
从手册页:-R,-r,-recursive-递归复制目录
Dave Jennings

6
@DaveJennings:仅仅因为它们在一个平台上是等效的,并不意味着它们就在所有平台上。cp实际上,在某些实现上存在区别。参见Random832的答案。@Ignacio,您应该在此答案中包含一个限定词,说明“如果您cp是现代GNU实现”或类似的东西。
卡莱布

@Caleb:这个问题被标记为“ linux”。还有什么呢?
伊格纳西奥·巴斯克斯

3
-R和-r在我使用的某些系统(OS X,FreeBSD,BusyBox coreutils;目前不确定哪个)上具有不同的行为。我很久以前就决定始终-R只使用它是谨慎的做法,实际上,刚才提到的系统上的一些手册页也建议这样做。
dubiousjim 2012年

17

小写字母-r是4.1BSD中引入的一个较旧的选项,它将简单地将所有非目录复制为文件。也就是说,如果遇到设备或FIFO,它将打开它,读取内容,并在包含该内容的目标位置创建文件。

大写-R是一个标准选项(在4.4BSD中引入了BSD,尽管较早的版本将其作为的代名词-r)在遇到设备,FIFO或其他特殊文件时,将在目标位置生成等效的特殊文件。

许多实现仍然保持这种区别,但是某些实现(包括Linux典型的GNU版本)仅提供-R语义,并-r作为同义词。


3

在OS X和旧版本的FreeBSD -r中,就像-R -L --copy-contents在coreutils中一样,或者它遵循符号链接并读取特殊文件和FIFO的内容。

mkdir a;touch b;ln -s $PWD/b a;cp -r a c在OS X中将符号链接替换为目标文件,mkdir a;mkfifo a/b;cp -r a c被阻止读取FIFO,并mkdir a;ln -s /dev/zero a;cp -r a b开始填充b/zero零。

cp在OS X和旧版本的FreeBSD 的手册页中:

Historic versions of the cp utility had a -r option.  This implementation
supports that option; however, its use is strongly discouraged, as it
does not correctly copy special files, symbolic links, or fifo's.

在新版本的FreeBSD -r中相当于-RL

Historic versions of the cp utility had a -r option.  This  implementation
supports that option, however, its  behavior is different from historical
FreeBSD behavior.   Use of this option is strongly discouraged as the
behavior is implementation-dependent.  In FreeBSD,  -r is a synonym for
-RL and works the same unless modified by other flags.  Historical  imple-
mentations  of -r differ as they copy special files as normal files while
recreating  a hierarchy.

http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html

--copy-contents

如果以递归方式复制,请复制任何特殊文件(例如,FIFO和设备文件)的内容,就像它们是常规文件一样。这意味着尝试读取每个源文件中的数据并将其写入目标。使用此选项通常是一个错误,因为它通常会对特殊文件(如FIFO)和通常在/dev目录中找到的文件产生不良影响。在大多数情况下,cp -R --copy-contents它将无限期挂起,尝试从FIFO和特殊文件中读取/dev/console,并且,如果使用它来复制,它将填满目标磁盘/dev/zero。除非以递归方式进行复制,否则此选项无效,并且不影响符号链接的复制。


-1

我发现其中之一是-r不会复制隐藏目录,而-R会复制隐藏目录。

我在目标目录中测试了.git目录,得出了以上结论。我当前正在使用centOS。

我可能是错的,但值得讨论。


4
我在CentOS 5上看不到它。-r并且-R都复制了隐藏目录
Michael Mrozek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.