it-swarm.it

Differenza tra cp -r e cp -R (comando copia)

cp -r ha lo scopo di copiare i file in modo ricorsivo e cp -R per copiare ricorsivamente le directory. Ma ho controllato, ed entrambi sembrano copiare sia i file che le directory, la stessa cosa. Quindi, qual è la differenza in realtà?

63
its_me

Mentre -R è posix ben definito, -r non è portatile!

Su Linux, nelle implementazioni GNU e BusyBox di cp, -r e -R sono equivalenti.

Dall'altro lato, come puoi leggere nella pagina di manuale POSIX di cp, -r il comportamento è definito dall'implementazione .

    * 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.
76
andcoz

Minuscolo -r era un'opzione precedente, introdotta in 4.1BSD, che avrebbe semplicemente copiato tutte le non directory come file. Cioè, se incontra un dispositivo o FIFO, lo apre, legge i contenuti e crea un file a destinazione con i contenuti.

Maiuscolo -R era un'opzione standardizzata (introdotta in BSD in 4.4BSD, sebbene le versioni precedenti lo avessero come sinonimo di -r) che, incontrando un dispositivo, un FIFO o un altro file speciale, creerebbe un file speciale equivalente nella destinazione.

Molte implementazioni mantengono ancora questa distinzione, ma alcune (inclusa la GNU versione tipica di Linux) forniscono solo la -R semantica, con -r come sinonimo.

19
Random832

La differenza è che uno usa una "R" minuscola e l'altro usa una "R" maiuscola. Oltre a ciò, nessuna differenza. Stessa cosa se usi --recursive opzione lunga.

18

In OS X e versioni precedenti di FreeBSD -r è come -R -L --copy-contents in coreutils, oppure segue collegamenti simbolici e legge il contenuto di file speciali e FIFO.

mkdir a;touch b;ln -s $PWD/b a;cp -r a c sostituisce il collegamento simbolico con il file di destinazione in OS X, mkdir a;mkfifo a/b;cp -r a c viene bloccato durante la lettura di FIFO e mkdir a;ln -s /dev/zero a;cp -r a b inizia a riempire b/zero con zero.

Dalla pagina man cp in OS X e versioni precedenti di 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.

Nelle nuove versioni di 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 copi in modo ricorsivo, copia il contenuto di tutti i file speciali (ad es. FIFO e file del dispositivo) come se fossero file normali. Ciò significa provare a leggere i dati in ciascun file sorgente e scriverli nella destinazione. Di solito è un errore usare questa opzione, poiché normalmente ha effetti indesiderati su file speciali come FIFO e quelli che si trovano in genere in /dev directory. Nella maggior parte dei casi, cp -R --copy-contents si bloccherà indefinitamente cercando di leggere da FIFO e file speciali come /dev/console e riempirà il disco di destinazione se lo usi per copiare /dev/zero. Questa opzione non ha alcun effetto se non la copia ricorsiva e non influisce sulla copia di collegamenti simbolici.

3
Lri