Forskellen mellem cp -r og cp -R (kopi-kommando)
On februar 18, 2021 by admin cp -r
er beregnet til at kopiere filer rekursivt, og cp -R
til kopiering af mapper rekursivt. Men jeg har kontrolleret, og begge ser ud til at kopiere både filer og mapper, det samme. Så hvad er forskellen egentlig?
Kommentarer
- Hver omtale af disse muligheder i Linux-manualerne siger, at de ‘ er synonymer. (De ‘ findes ikke på nogle andre unix-varianter.)
Svar
Mens -R
er posix veldefineret, er -r
ikke bærbar!
På Linux i GNU- og BusyBox-implementeringerne af cp
, -r
og -R
er ækvivalente.
På den anden side, som du kan læse i POSIX manuel side af cp
, -r
adfærd er implementeringsdefineret .
* 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.
Kommentarer
- En af forskellene ville være, at f.eks. i OSX
-r
kopierer de rigtige filer peget med symbolske links, mens-R
vil kopier det symbolske link, som det er beregnet til de fleste gange.
Svar
Små bogstaver -r
var en ældre mulighed, introduceret i 4.1BSD, som simpelthen ville kopiere alle ikke-mapper som filer. Det vil sige, at hvis den stødte på en enhed eller FIFO, ville den åbne den, læse indholdet og oprette en fil på destinationen med indholdet.
Stor bogstav -R
var en standardiseret mulighed (introduceret til BSD i 4.4BSD, skønt tidligere versioner havde det som et synonym til -r
), som ved stød på en enhed, FIFO eller en anden speciel fil, lav en ækvivalent specialfil på destinationen.
Mange implementeringer opretholder stadig denne forskel, men nogle (inklusive GNU-versionen, der er typisk for Linux), leverer kun -R
semantik med -r
som synonym.
Svar
Forskellen er, at den ene bruger små bogstaver “R”, og den anden bruger store bogstaver “R”. Derudover er der ingen forskel. Den samme ting, hvis du bruger --recursive
lang mulighed.
Kommentarer
- Fra mandsiden: – R, -r, –recursive – kopier mapper rekursivt
- @DaveJennings: Bare fordi de er ækvivalente på en platform, betyder det ikke ‘ at de er på alle. På nogle implementeringer af
cp
er der faktisk en forskel. Se Random832 ‘ s svar . @Ignacio, du skal medtage en kvalifikator i dette svar, der siger “, hvis dincp
er den moderne GNU-implementering ” eller noget lignende. - @Caleb: Spørgsmålet er tagget ” linux “. Hvad ville det ellers være?
- -R og -r giver forskellige adfærd på nogle af de systemer, jeg bruger (OS X, FreeBSD, BusyBox coreutils; ikke sikker på hvilke i øjeblikket). Jeg besluttede for længe siden, at det var klogt kun altid at bruge
-R
, og faktisk anbefaler nogle af mandsiderne på de netop nævnte systemer det også.
Svar
I OS X og gamle versioner af FreeBSD -r
er som -R -L --copy-contents
i coreutils, eller det følger symlinks og læser indholdet af specielle filer og FIFOer.
mkdir a;touch b;ln -s $PWD/b a;cp -r a c
erstatter symlinket med målfilen i OS X, mkdir a;mkfifo a/b;cp -r a c
bliver blokeret ved læsning af FIFO, og mkdir a;ln -s /dev/zero a;cp -r a b
begynder at udfylde b/zero
med nuller .
Fra cp
man-siden i OS X og gamle versioner af 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.
I nye versioner af FreeBSD -r
svarer til -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
Hvis du kopierer rekursivt, skal du kopiere indholdet af eventuelle specielle filer (f.eks. FIFOer og enhedsfiler) som om de var almindelige filer. Dette betyder at prøve at læse dataene i hver kildefil og skrive dem til destinationen. Det er normalt en fejl at bruge denne indstilling, da den normalt har uønskede effekter på specielle filer som FIFOer og dem, der typisk findes i
/dev
-mappen.I de fleste tilfælde hængercp -R --copy-contents
på ubestemt tid og prøver at læse fra FIFOer og specielle filer som/dev/console
, og det fylder din destinationsdisk, hvis du bruger den til at kopiere/dev/zero
. Denne indstilling har ingen virkning, medmindre der kopieres rekursivt, og den påvirker ikke kopieringen af symbolske links.
Svar
en af forskellen, jeg fandt ud af, at -r ikke kopier skjulte mapper, mens -R kopier skjulte mapper.
Jeg testede den .git-mappe i målmappen og kom til ovenstående konklusion. Jeg bruger i øjeblikket centOS.
Jeg kan tage fejl, men det er åbent for diskussion.
Kommentarer
- Jeg har ikke noget ‘ t se dette på CentOS 5;
-r
og-R
kopierer begge skjulte mapper
Skriv et svar