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

60

cp -rdestina-se a copiar arquivos recursivamente e cp -Ra copiar diretórios recursivamente. Mas verifiquei, e ambos parecem copiar arquivos e diretórios, a mesma coisa. Então, qual é a diferença, na verdade?

wsou eu
fonte
2
Toda menção dessas opções nos manuais do Linux diz que são sinônimos. (Eles não estão em algum outro variantes de Unix.)
'stop SO sendo maus' Gilles

Respostas:

74

Enquanto o -Rposix está bem definido, -rnão é portátil!

No Linux, nas implementações GNU e BusyBox de cp, -re -Rsão equivalentes.

Por outro lado, como você pode ler na página de manual do POSIXcp , o -rcomportamento é definido pela implementação .

    * 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.
andcoz
fonte
14
Uma das diferenças seria que, no OSX, por exemplo, -rcopie os arquivos reais apontados por links simbólicos, enquanto -Rcopie o link simbólico, o que é pretendido na maioria das vezes.
N /
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 --recursiveopção longa.

Ignacio Vazquez-Abrams
fonte
4
A partir da página man: -R, -R, --recursive - diretórios de cópia recursiva
Dave Jennings
6
@DaveJennings: Só porque eles são equivalentes em uma plataforma não significa que eles estão em todos. Em algumas implementações de cplá realmente há uma distinção. Veja a resposta do Random832 . @ Ignacio, você deve incluir um qualificador nesta resposta que diga "se você cpé a implementação moderna do GNU" ou algo assim.
Caleb
@ Caleb: A pergunta está marcada com "linux". O que mais poderia ser?
Ignacio Vazquez-Abrams
4
-R e -r dão um comportamento diferente em alguns dos sistemas que eu uso (OS X, FreeBSD, Core Busils da BusyBox; não tenho certeza de quais no momento). Decidi há muito tempo que era prudente usar sempre -Rapenas e, de fato, algumas das páginas de manual dos sistemas mencionados também recomendam isso.
dubiousjim
17

Minúsculas -rera 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, o abriria, leria o conteúdo e criaria um arquivo no destino com o conteúdo.

Maiúsculas -Rera uma opção padronizada (introduzida no BSD no 4.4BSD, embora as versões anteriores o tivessem como sinônimo -r) que, ao encontrar um dispositivo, FIFO ou outro arquivo especial, criaria um arquivo especial equivalente 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 -Rsemântica, -rcomo sinônimo.

Random832
fonte
3

No OS X, as versões antigas do FreeBSD -rsão semelhantes às -R -L --copy-contentsdo coreutils, ou seguem 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 csubstitui o link simbólico pelo arquivo de destino no OS X, mkdir a;mkfifo a/b;cp -r a cfica bloqueado na leitura do FIFO e mkdir a;ln -s /dev/zero a;cp -r a bcomeça a ser preenchido b/zerocom zeros.

Na cppágina do manual no OS X e nas 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.

Nas 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.

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

--copy-contents

Se estiver copiando recursivamente, copie o conteúdo de qualquer arquivo especial (por exemplo, FIFOs e arquivos de dispositivo) como se fossem arquivos regulares. Isso significa tentar ler os dados em cada arquivo de origem e gravá-los no destino. Geralmente, é um erro usar essa opção, pois normalmente tem efeitos indesejáveis ​​em arquivos especiais, como FIFOs e aqueles normalmente encontrados no /devdiretório. Na maioria dos casos, cp -R --copy-contentstravará indefinidamente tentando ler FIFOs e arquivos especiais como /dev/console, e preencherá o disco de destino se você o copiar /dev/zero. Esta opção não tem efeito, a menos que seja copiada recursivamente e não afeta a cópia de links simbólicos.

Lri
fonte
-1

uma das diferenças que 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. Atualmente, estou usando o centOS.

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

Zeel SHah
fonte
4
Não vejo isso no CentOS 5; -re -Rtanto copiar diretórios ocultos
Michael Mrozek