La differenza tra cp -r e cp -R (comando di copia)
Su Febbraio 18, 2021 da admin cp -r
ha lo scopo di copiare i file in modo ricorsivo, e cp -R
per copiare le directory in modo ricorsivo. Ma ho controllato, ed entrambi sembrano copiare sia i file che le directory, la stessa cosa. Allora, qual è la differenza in realtà?
Commenti
- Ogni menzione di queste opzioni nei manuali di Linux dice che sono ‘ sinonimi. (Non sono ‘ su alcune altre varianti di Unix.)
Rispondi
Sebbene -R
sia ben definito posix, -r
non è portabile!
Su Linux, in le implementazioni GNU e BusyBox di cp
, -r
e -R
sono equivalenti.
Dallaltro lato, come puoi leggere nella pagina di manuale POSIX di cp
, -r
il comportamento è definito dallimplementazione .
* 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.
Commenti
- Una delle differenze sarebbe che, ad esempio in OSX,
-r
copierà i file reali puntati da link simbolici mentre-R
copia il link simbolico che è quello che è inteso la maggior parte delle volte.
Risposta
-r
era unopzione precedente, introdotta in 4.1BSD, che copiava semplicemente tutte le non directory come file. Cioè, se incontra un dispositivo o FIFO, lo apre, ne legge il contenuto e crea un file nella destinazione con i contenuti.
Maiuscolo -R
era unopzione standardizzata (introdotta in BSD in 4.4BSD, sebbene le versioni precedenti lo avessero come sinonimo di -r
) che, incontrando un dispositivo, FIFO o altri file speciali, crea un file speciale equivalente nella destinazione.
Molte implementazioni mantengono ancora questa distinzione, ma alcune (inclusa la versione GNU tipica di Linux) forniscono solo -R
semantica, con -r
come sinonimo.
Risposta
La differenza è che uno usa una “R” minuscola e laltro usa una “R” maiuscola. Oltre a ciò, nessuna differenza. Stessa cosa se utilizzi lopzione --recursive
long.
Commenti
- Dalla pagina man: – R, -r, –recursive – copia le directory in modo ricorsivo
- @DaveJennings: Solo perché sono equivalenti su una piattaforma ‘ non significa che siano su tutte. In alcune implementazioni di
cp
cè effettivamente una distinzione. Visualizza la risposta di Random832 ‘ . @Ignacio dovresti includere un qualificatore in questa risposta che dice ” se il tuocp
è la moderna implementazione GNU ” o qualcosa del genere. - @Caleb: la domanda è contrassegnata con ” linux “. Cosaltro sarebbe?
- -R e -r danno un comportamento diverso su alcuni dei sistemi che uso (OS X, FreeBSD, coreutils BusyBox; non sono sicuro di quali al momento). Ho deciso molto tempo fa che fosse prudente usare sempre solo
-R
, e in effetti anche alcune delle pagine man sui sistemi appena menzionati lo raccomandano.
Risposta
In OS X e vecchie versioni 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 nella lettura del FIFO e mkdir a;ln -s /dev/zero a;cp -r a b
inizia a riempire b/zero
con zeri .
Dalla pagina man cp
in OS X e vecchie versioni 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 si copia in modo ricorsivo, copia il contenuto di qualsiasi file speciale (ad es. FIFO e file di dispositivo) come se fossero file normali. Ciò significa provare a leggere i dati in ogni file di origine 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 tipicamente nella directory
/dev
.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 effetto a meno che non si copi in modo ricorsivo e non influisce sulla copia dei collegamenti simbolici.
Risposta
una delle differenze che ho scoperto che -r non lo fa copia le directory nascoste mentre -R copia le directory nascoste.
Lho testato nella directory .git nella directory di destinazione e sono giunto alla conclusione precedente. Attualmente sto usando centOS.
Potrei sbagliarmi ma è aperto a discussioni.
Commenti
- Non lo so ‘ t vedere questo su CentOS 5;
-r
e-R
entrambi copiano directory nascoste
Lascia un commento