cp -r
è pensato per 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à?
cp -r
è pensato per 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à?
Risposte:
Mentre -R
posix è ben definito, -r
non è portatile!
Su Linux, nelle implementazioni di GNU e busybox di cp
, -r
e -R
sono equivalenti.
D'altra parte, come puoi leggere nella pagina del manuale POSIX di cp
, il -r
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.
-r
copieranno i file reali puntati da collegamenti simbolici mentre -R
copieranno il collegamento simbolico che è quello che è inteso la maggior parte delle volte.
La differenza è che uno usa una "R" minuscola e l'altro usa una "R" maiuscola. Oltre a ciò, nessuna differenza. Stessa cosa se usi l' --recursive
opzione lunga.
cp
lì c'è in realtà una distinzione. Vedi la risposta di Random832 . @Ignacio dovresti includere un qualificatore in questa risposta che dice "se la tua cp
è la moderna implementazione GNU" o qualcosa del genere.
-R
solo, e in effetti alcune delle pagine man sui sistemi appena citati lo raccomandano anche.
La minuscola -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.
Il 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, avrebbe creato un file speciale equivalente nella destinazione.
Molte implementazioni mantengono ancora questa distinzione, ma alcune (inclusa la versione GNU tipica di Linux) forniscono solo la -R
semantica, -r
come sinonimo.
In OS X e nelle 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 leggendo FIFO e mkdir a;ln -s /dev/zero a;cp -r a b
inizia a riempire b/zero
con zero.
Dalla cp
pagina man 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 di 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 nella
/dev
directory. Nella maggior parte dei casi, sicp -R --copy-contents
bloccherà indefinitamente cercando di leggere da FIFO e file speciali come/dev/console
, e riempirà il disco di destinazione se lo si utilizza per la copia/dev/zero
. Questa opzione non ha alcun effetto se non la copia ricorsiva e non influisce sulla copia di collegamenti simbolici.
una delle differenze ho scoperto che -r non copia directory nascoste mentre -R copia directory nascoste.
Ho testato la directory .git nella directory di destinazione e sono giunto alla conclusione sopra. Attualmente sto usando centOS.
Potrei sbagliarmi ma è aperto alla discussione.
-r
ed -R
entrambi copiano directory nascoste