cp -r
está destinado a copiar archivos de forma recursiva y cp -R
para 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?
cp -r
está destinado a copiar archivos de forma recursiva y cp -R
para 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?
Respuestas:
Si -R
bien posix está bien definido, ¡ -r
no es portátil!
En Linux, en las implementaciones de GNU y BusyBox cp
, -r
y -R
son equivalentes.
Por otro lado, como puede leer en la página del manual POSIX de cp
, el -r
comportamiento 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.
-r
copiará los archivos reales señalados por enlaces simbólicos, mientras -R
que copiará el enlace simbólico, que es lo que se pretende la mayoría de las veces.
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 --recursive
opción larga.
cp
hay realmente una distinción. Ver la respuesta de Random832 . @Ignacio, debe incluir un calificador en esta respuesta que diga "si su cp
es la implementación moderna de GNU" o algo así.
-R
solo, y de hecho algunas de las páginas de manual en los sistemas que acabamos de mencionar también lo recomiendan.
Minúscula -r
era 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 -R
era 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 -R
semántica, -r
como sinónimo.
En OS X y versiones anteriores de FreeBSD -r
es como -R -L --copy-contents
en 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 c
reemplaza el enlace simbólico con el archivo de destino en OS X, mkdir a;mkfifo a/b;cp -r a c
se bloquea al leer el FIFO y mkdir a;ln -s /dev/zero a;cp -r a b
comienza a rellenarse b/zero
con ceros.
Desde la cp
pá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 -r
es 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
/dev
directorio. En la mayoría de los casos,cp -R --copy-contents
se 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.
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.
-r
y -R
ambos copian directorios ocultos