Diferencia entre cp -r y cp -R (comando de copia)


60

cp -restá destinado a copiar archivos de forma recursiva y cp -Rpara copiar directorios de forma recursiva. Pero lo he comprobado, y ambos parecen copiar archivos y directorios, lo mismo. Entonces, ¿cuál es la diferencia en realidad?


2
Cada mención de estas opciones en los manuales de Linux dice que son sinónimos. (No están en otras variantes de Unix.)
Gilles 'SO- deja de ser malvado'

Respuestas:


74

Si -Rbien posix está bien definido, ¡ -rno es portátil!

En Linux, en las implementaciones de GNU y BusyBox cp, -ry -Rson equivalentes.

Por otro lado, como puede leer en la página del manual POSIX de cp, el -rcomportamiento está definido por la implementación .

    * 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
Una de las diferencias sería que, en OSX, por ejemplo, -rcopiará los archivos reales señalados por enlaces simbólicos, mientras -Rque copiará el enlace simbólico, que es lo que se pretende la mayoría de las veces.
nacho4d

19

La diferencia es que uno usa una "R" minúscula y el otro usa una "R" mayúscula. Más allá de eso, no hay diferencia. Lo mismo si usa la --recursiveopción larga.


44
Desde la página de manual: -R, -r, --recursive - copiar directorios recursivamente
Dave Jennings

66
@DaveJennings: el hecho de que sean equívocos en una plataforma no significa que lo sean en todos. En algunas implementaciones de cphay realmente una distinción. Ver la respuesta de Random832 . @Ignacio, debe incluir un calificador en esta respuesta que diga "si su cpes la implementación moderna de GNU" o algo así.
Caleb

@Caleb: La pregunta está etiquetada como "Linux". ¿Qué otra cosa podría ser?
Ignacio Vazquez-Abrams

44
-R y -r dan un comportamiento diferente en algunos de los sistemas que uso (OS X, FreeBSD, BusyBox coreutils; no estoy seguro de cuáles en este momento). Decidí hace mucho tiempo que era prudente usar siempre -Rsolo, y de hecho algunas de las páginas de manual en los sistemas que acabamos de mencionar también lo recomiendan.
dubiousjim

17

Minúscula -rera una opción anterior, introducida en 4.1BSD, que simplemente copiaría todos los no directorios como archivos. Es decir, si encuentra un dispositivo o FIFO, lo abrirá, leerá el contenido y creará un archivo en el destino con el contenido.

Mayúscula -Rera una opción estandarizada (introducida en BSD en 4.4BSD, aunque las versiones anteriores la tenían como sinónimo de -r) que, al encontrar un dispositivo, FIFO u otro archivo especial, crearía un archivo especial equivalente en el destino.

Muchas implementaciones aún mantienen esta distinción, pero algunas (incluida la versión GNU típica de Linux) solo proporcionan la -Rsemántica, -rcomo sinónimo.


3

En OS X y versiones anteriores de FreeBSD -res como -R -L --copy-contentsen coreutils, o sigue enlaces simbólicos y lee el contenido de archivos especiales y FIFOs.

mkdir a;touch b;ln -s $PWD/b a;cp -r a creemplaza el enlace simbólico con el archivo de destino en OS X, mkdir a;mkfifo a/b;cp -r a cse bloquea al leer el FIFO y mkdir a;ln -s /dev/zero a;cp -r a bcomienza a rellenarse b/zerocon ceros.

Desde la cppágina del manual en OS X y versiones anteriores de 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.

En las nuevas versiones de FreeBSD -res equivalente a -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

Si copia de forma recursiva, copie el contenido de cualquier archivo especial (p. Ej., FIFO y archivos del dispositivo) como si fueran archivos normales. Esto significa tratar de leer los datos en cada archivo fuente y escribirlos en el destino. Por lo general, es un error utilizar esta opción, ya que normalmente tiene efectos no deseados en archivos especiales como FIFO y los que normalmente se encuentran en el /devdirectorio. En la mayoría de los casos, cp -R --copy-contentsse bloqueará indefinidamente tratando de leer desde FIFO y archivos especiales como /dev/console, y llenará su disco de destino si lo usa para copiar /dev/zero. Esta opción no tiene efecto a menos que se copie de forma recursiva, y no afecta la copia de enlaces simbólicos.


-1

Una de las diferencias es que encontré que -r no copia directorios ocultos mientras que -R copia directorios ocultos.

Lo probé .git directorio en el directorio de destino y llegué a la conclusión anterior. Estoy usando actualmente centOS.

Puedo estar equivocado pero está abierto a discusión.


44
No veo esto en CentOS 5; -ry -Rambos copian directorios ocultos
Michael Mrozek
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.