Diferença entre cp -r e cp -R (comando de cópia)

58

cp -r destina-se a copiar arquivos recursivamente e cp -R para copiar diretórios recursivamente. Mas eu verifiquei, e ambos parecem copiar os arquivos e diretórios, a mesma coisa. Então qual é a diferença, na verdade?

    
por its_me 14.08.2011 / 06:21

5 respostas

72

Embora -R seja posix bem definido, -r não é portátil!

No Linux, nas implementações do GNU e BusyBox de cp , -r e -R são equivalentes.

Por outro lado, como você pode ler na página de manual POSIX de cp , -r behavior é implementation-defined .

    * 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.
    
por 14.08.2011 / 12:14
19

A diferença é que um usa um "R" minúsculo e o outro usa um "R" maiúsculo. Além disso, não há diferença. A mesma coisa se você usar a opção --recursive long.

    
por 14.08.2011 / 06:28
17

Lowercase -r era uma opção mais antiga, introduzida no 4.1BSD, que simplesmente copiava todos os não diretórios como arquivos. Ou seja, se encontrasse um dispositivo ou FIFO, ele seria aberto, lido o conteúdo e criado um arquivo no destino com o conteúdo.

Letras maiúsculas -R era uma opção padronizada (introduzida no BSD no 4.4BSD, embora versões anteriores a tivessem como sinônimo de -r ) que, ao encontrar um dispositivo, FIFO, ou outro arquivo especial, faria um equivalente arquivo especial no destino.

Muitas implementações ainda mantêm essa distinção, mas algumas (incluindo a versão GNU típica do Linux) fornecem apenas a semântica -R , com -r como sinônimo.

    
por 14.08.2011 / 15:34
3

No OS X e em versões antigas do FreeBSD -r é como -R -L --copy-contents em coreutils, ou segue links simbólicos e lê o conteúdo de arquivos especiais e FIFOs.

mkdir a;touch b;ln -s $PWD/b a;cp -r a c substitui o symlink pelo arquivo de destino no OS X, mkdir a;mkfifo a/b;cp -r a c fica bloqueado lendo o FIFO e mkdir a;ln -s /dev/zero a;cp -r a b começa a preencher b/zero com zeros.

Da página cp man no OS X e versões antigas do 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.

Em novas versões do FreeBSD -r é 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.

link :

--copy-contents

If copying recursively, copy the contents of any special files (e.g., FIFOs and device files) as if they were regular files. This means trying to read the data in each source file and writing it to the destination. It is usually a mistake to use this option, as it normally has undesirable effects on special files like FIFOs and the ones typically found in the /dev directory. In most cases, cp -R --copy-contents will hang indefinitely trying to read from FIFOs and special files like /dev/console, and it will fill up your destination disk if you use it to copy /dev/zero. This option has no effect unless copying recursively, and it does not affect the copying of symbolic links.

    
por 29.05.2014 / 16:57
-1

uma das diferenças descobri que -r não copia diretórios ocultos enquanto -R copia diretórios ocultos.

Eu testei o diretório .git no diretório de destino e cheguei à conclusão acima. Eu estou usando atualmente centOS.

Eu posso estar errado, mas está aberto à discussão.

    
por 03.04.2015 / 13:20

Tags