Diferença entre cp -r e cp -R (comando de cópia)
On Fevereiro 18, 2021 by admin cp -r
serve para copiar arquivos recursivamente, e cp -R
para copiar diretórios recursivamente. Mas eu verifiquei, e ambos parecem copiar arquivos e diretórios, a mesma coisa. Então, qual é a diferença realmente?
Comentários
- Cada menção a essas opções nos manuais do Linux indica que elas ‘ são sinônimos. (Eles ‘ não estão em algumas outras variantes do Unix.)
Resposta
Embora -R
seja posix bem definido, -r
não é portátil!
No Linux, em as implementações 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
o comportamento é 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.
Comentários
- Uma das diferenças seria que, no OSX por exemplo,
-r
copiará os arquivos reais apontados por links simbólicos enquanto-R
irá copie o link simbólico que é o pretendido na maioria das vezes.
Resposta
Minúsculas -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 ele encontrasse um dispositivo ou FIFO, ele o abriria, leria o conteúdo e criaria um arquivo no destino com o conteúdo.
Maiúsculas -R
era uma opção padronizada (introduzida no BSD no 4.4BSD, embora as versões anteriores a tivessem como sinônimo de -r
) que, ao encontrar um dispositivo, FIFO ou outro arquivo especial, faça 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 o -R
semântica, com -r
como sinônimo.
Resposta
A diferença é que um usa um “R” minúsculo e o outro usa um “R” maiúsculo. Além disso, nenhuma diferença. A mesma coisa se você usar a opção --recursive
longa.
Comentários
- Da página de manual: – R, -r, –recursive – copia diretórios recursivamente
- @DaveJennings: Só porque eles são ambíguos em uma plataforma não ‘ significa que estão em todas. Em algumas implementações de
cp
realmente há uma distinção. Veja a Random832 ‘ resposta . @Ignacio você deve incluir um qualificador nesta resposta que diz ” se seucp
é a implementação GNU moderna ” ou algo parecido. - @Caleb: A pergunta está marcada como ” linux “. O que mais seria?
- -R e -r apresentam comportamentos diferentes em alguns dos sistemas que uso (OS X, FreeBSD, BusyBox coreutils; não tenho certeza de quais no momento). Decidi há muito tempo que era prudente sempre usar apenas
-R
e, de fato, algumas das páginas de manual dos sistemas mencionados também recomendam isso.
Resposta
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 link simbólico pelo arquivo de destino em OS X, mkdir a;mkfifo a/b;cp -r a c
é bloqueado ao ler 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 de manual cp
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.
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 copiar recursivamente, copie o conteúdo de quaisquer arquivos especiais (por exemplo, FIFOs e arquivos de dispositivo) como se fossem arquivos normais. Isso significa tentar ler os dados em cada arquivo de origem e gravá-los no destino. Normalmente é um erro usar esta opção, pois normalmente ela tem efeitos indesejáveis em arquivos especiais como FIFOs e aqueles normalmente encontrados no diretório
/dev
.Na maioria dos casos,cp -R --copy-contents
irá travar indefinidamente tentando ler FIFOs e arquivos especiais como/dev/console
, e encherá seu disco de destino se você o usa para copiar/dev/zero
. Esta opção não tem efeito a menos que seja feita uma cópia recursiva e não afeta a cópia de links simbólicos.
Resposta
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. No momento, estou usando o centOS.
Posso estar errado, mas está aberto para discussão.
Comentários
- Eu não ‘ não vejo isso no CentOS 5;
-r
e-R
ambos copiam diretórios ocultos
Deixe uma resposta