La diferencia entre cp -r y cp -R (comando de copia)
On febrero 18, 2021 by admin 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?
Comentarios
- Cada mención de estas opciones en los manuales de Linux dice que ‘ son sinónimos. (Ellos ‘ no están en otras variantes de Unix.)
Respuesta
Si bien -R
es posix bien definido, -r
no es portátil.
En Linux, en las implementaciones GNU y BusyBox de cp
, -r
y -R
son equivalentes.
Por otro lado, como puede leer en la página de manual de POSIX de cp
, -r
el comportamiento es 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.
Comentarios
- Una de las diferencias sería que, en OSX, por ejemplo,
-r
copiará los archivos reales señalados por enlaces simbólicos mientras que-R
copia el enlace simbólico que es lo que se pretende la mayoría de las veces.
Responder
Minúscula -r
era una opción anterior, introducida en 4.1BSD, que simplemente copiaría todos los que no fueran directorios como archivos. Es decir, si encuentra un dispositivo o FIFO, lo abre, lee el contenido y crea un archivo en el destino con el contenido.
Mayúsculas -R
era una opción estandarizada (introducida en BSD en 4.4BSD, aunque las versiones anteriores lo tenían como sinónimo de -r
) que, al encontrar un dispositivo, FIFO u otro archivo especial, crea 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 el -R
semántica, con -r
como sinónimo.
Respuesta
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.
Comentarios
- Desde la página del manual: – R, -r, –recursive – copiar directorios de forma recursiva
- @DaveJennings: El hecho de que sean equívocos en una plataforma no ‘ no significa que estén en todas. En algunas implementaciones de
cp
, existe una distinción. Consulta la respuesta de Random832 ‘ . @Ignacio, debe incluir un calificador en esta respuesta que diga » si sucp
es la implementación GNU moderna » o algo así. - @Caleb: La pregunta está etiquetada » linux «. ¿Qué más sería?
- -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). Hace mucho tiempo que decidí que era prudente usar siempre
-R
únicamente y, de hecho, algunas de las páginas de manual de los sistemas que acabo de mencionar también lo recomiendan.
Respuesta
En OS X y versiones antiguas de FreeBSD, -r
es como -R -L --copy-contents
en coreutils, o sigue enlaces simbólicos y lee el contenido de archivos especiales y FIFO.
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 llenar b/zero
con ceros .
Desde la página de manual cp
en OS X y versiones antiguas 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 (por ejemplo, FIFO y archivos de dispositivo) como si fueran archivos normales. Esto significa intentar leer los datos en cada archivo de origen y escribirlos en el destino. Por lo general, es un error usar esta opción, ya que normalmente tiene efectos no deseados en archivos especiales como FIFO y los que normalmente se encuentran en el directorio
/dev
.En la mayoría de los casos,cp -R --copy-contents
se bloqueará indefinidamente al intentar 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 ningún efecto a menos que se realice una copia recursiva y no afecta la copia de enlaces simbólicos.
Responder
Una de las diferencias que encontré es que -r no copia los directorios ocultos mientras que -R copia los directorios ocultos.
Probé el directorio .git en el directorio de destino y llegué a la conclusión anterior. Actualmente estoy usando centOS.
Puede que esté equivocado, pero está abierto a discusión.
Comentarios
- No ‘ t veo esto en CentOS 5;
-r
y-R
ambos copian directorios ocultos
Deja una respuesta