Diferența dintre cp -r și cp -R (comandă copiere)
On februarie 18, 2021 by admin cp -r
este menită să copieze fișiere recursiv, și cp -R
pentru copierea directoarelor recursiv. Dar am „verificat și ambele par să copieze atât fișiere, cât și directoare, același lucru. Deci, care este diferența de fapt?
Comentarii
- Fiecare mențiune a acestor opțiuni din manualele Linux spune că acestea ‘ sunt sinonime. (Ei ‘ nu fac parte din alte variante unix.)
Răspuns
În timp ce -R
este pozix bine definit, -r
nu este portabil!
Pe Linux, în implementările GNU și BusyBox ale cp
, -r
și -R
sunt echivalente.
Pe de altă parte, după cum puteți citi în pagina de manual POSIX din cp
, -r
comportamentul este implementat-definit .
* 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.
Comentarii
Răspuns
Minuscule -r
a fost o opțiune mai veche, introdusă în 4.1BSD, care ar copia pur și simplu toate fișierele non-directoare. Adică, dacă a întâlnit un dispozitiv sau FIFO, l-ar deschide, ar citi conținutul și ar crea un fișier la destinație cu conținutul.
Majuscule -R
a fost o opțiune standardizată (introdusă în BSD în 4.4BSD, deși versiunile anterioare o aveau ca sinonim cu -r
) care, la întâlnirea cu un dispozitiv, FIFO sau alt fișier special, faceți un fișier special echivalent la destinație.
Multe implementări păstrează în continuare această distincție, dar unele (inclusiv versiunea GNU tipică pentru Linux) furnizează doar -R
semantică, cu -r
ca sinonim.
Răspuns
Diferența este că una folosește un „R” cu litere mici, iar cealaltă folosește „R” cu majuscule. Dincolo de asta, nici o diferență. Același lucru dacă utilizați opțiunea --recursive
lungă.
Comentarii
- Din pagina de manual: – R, -r, –recursive – copiați directoare recursiv
- @DaveJennings: Doar pentru că sunt echivolente pe o platformă, nu ‘ înseamnă că sunt pe toate. În unele implementări ale
cp
există de fapt o distincție. Vedeți răspunsul Random832 ‘ . @Ignacio ar trebui să includeți un calificativ în acest răspuns care să spună ” dacăcp
este implementarea modernă GNU ” sau ceva de genul acesta. - @Caleb: Întrebarea este etichetată ” linux „. Ce altceva ar fi?
- -R și -r oferă un comportament diferit pe unele dintre sistemele pe care le folosesc (OS X, FreeBSD, coreyutile BusyBox; nu sunt sigur care sunt momentan). Am decis cu mult timp în urmă că este prudent să folosim întotdeauna numai
-R
și, de fapt, unele dintre paginile de man de pe sistemele menționate tocmai recomandă acest lucru.
Răspuns
În OS X și versiunile vechi ale FreeBSD -r
este ca -R -L --copy-contents
în coreutils, sau urmează link-uri simbolice și citește conținutul fișierelor speciale și FIFO-urilor.
mkdir a;touch b;ln -s $PWD/b a;cp -r a c
înlocuiește link-ul simbolic cu fișierul țintă în OS X, mkdir a;mkfifo a/b;cp -r a c
este blocat citind FIFO și mkdir a;ln -s /dev/zero a;cp -r a b
începe să umple b/zero
cu zerouri .
Din cp
pagina manuală în OS X și versiunile vechi ale 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.
În versiunile noi ale FreeBSD -r
este echivalent cu -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
Dacă copiați recursiv, copiați conținutul oricăror fișiere speciale (de exemplu, FIFO-uri și fișiere de dispozitiv) ca și cum ar fi fișiere obișnuite. Aceasta înseamnă să încercați să citiți datele din fiecare fișier sursă și să le scrieți la destinație. Este de obicei o greșeală să folosești această opțiune, deoarece are în mod normal efecte nedorite asupra fișierelor speciale precum FIFO-urile și pe cele găsite în mod obișnuit în directorul
/dev
.În majoritatea cazurilor,cp -R --copy-contents
va atârna la nesfârșit încercând să citească din FIFO-uri și fișiere speciale precum/dev/console
și vă va umple discul de destinație dacă îl utilizați pentru a copia/dev/zero
. Această opțiune nu are efect decât dacă copiați recursiv și nu afectează copierea legăturilor simbolice.
Răspuns
una dintre diferențe am constatat că -r nu copiați directoare ascunse în timp ce -R copiază directoare ascunse.
Am testat directorul .git în directorul țintă și am ajuns la concluzia de mai sus. În prezent folosesc centOS.
S-ar putea să mă înșel, dar este deschis discuției.
Comentarii
- Nu cred ‘ nu vezi acest lucru pe CentOS 5;
-r
și-R
ambele copieză directoare ascunse
-r
va copia fișierele reale indicate de legături simbolice în timp ce-R
copiați legătura simbolică care este destinată de cele mai multe ori.