Forskjellen mellom cp -r og cp -R (kopi-kommando)
On februar 18, 2021 by admin cp -r
er ment å kopiere filer rekursivt, og cp -R
for å kopiere kataloger rekursivt. Men jeg har sjekket, og begge ser ut til å kopiere både filer og kataloger, det samme. Så, hva er egentlig forskjellen?
Kommentarer
- Hver omtale av disse alternativene i Linux-håndbøkene sier at de ‘ er synonymer. (De ‘ er ikke på noen andre unix-varianter.)
Svar
Mens -R
er posix veldefinert, er -r
ikke bærbar!
På Linux, i GNU- og BusyBox-implementeringene av cp
, -r
og -R
er likeverdige.
På den andre siden, som du kan lese i POSIX manuell side av cp
, -r
atferd er implementeringsdefinert .
* 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 av forskjellene vil være at, i OSX, for eksempel,
-r
vil kopiere de virkelige filene pekt av symbolske lenker mens-R
vil kopier den symbolske lenken som er ment det som oftest.
Svar
Små bokstaver -r
var et eldre alternativ, introdusert i 4.1BSD, som ganske enkelt ville kopiere alle ikke-kataloger som filer. Det vil si at hvis den møtte en enhet eller FIFO, ville den åpne den, lese innholdet og opprette en fil på destinasjonen med innholdet.
Stor bokstav -R
var et standardisert alternativ (introdusert til BSD i 4.4BSD, selv om tidligere versjoner hadde det som et synonym til -r
) som, når det møtte en enhet, FIFO eller annen spesiell fil, lage en tilsvarende spesialfil på destinasjonen.
Mange implementeringer opprettholder fortsatt dette skillet, men noen (inkludert GNU-versjonen som er typisk for Linux) gir bare -R
semantikk, med -r
som synonym.
Svar
Forskjellen er at den ene bruker en liten «R» og den andre bruker en stor «R». Utover det, ingen forskjell. Det samme hvis du bruker alternativet --recursive
.
Kommentarer
- Fra mannssiden: – R, -r, –recursive – kopier kataloger rekursivt
- @DaveJennings: Bare fordi de er likeverdige på en plattform, betyr ikke det ‘ at de er på alle. På noen implementeringer av
cp
er det faktisk et skille. Se Random832 ‘ s svar . @Ignacio, du bør inkludere en kvalifisering i dette svaret som sier » hviscp
er den moderne GNU-implementeringen » eller noe sånt. - @Caleb: Spørsmålet er merket » linux «. Hva annet ville det være?
- -R og -r gir ulik oppførsel på noen av systemene jeg bruker (OS X, FreeBSD, BusyBox coreutils; ikke sikker på hvilke for øyeblikket). Jeg bestemte meg for lenge siden at det var forsvarlig å alltid bare bruke
-R
, og faktisk anbefaler noen av man-sidene på systemene som er nevnt også.
Svar
I OS X og gamle versjoner av FreeBSD -r
er som -R -L --copy-contents
i coreutils, eller det følger symlinker og leser innholdet i spesielle filer og FIFOer.
mkdir a;touch b;ln -s $PWD/b a;cp -r a c
erstatter symlink med målfilen i OS X, mkdir a;mkfifo a/b;cp -r a c
blir blokkert når du leser FIFO, og mkdir a;ln -s /dev/zero a;cp -r a b
begynner å fylle b/zero
med nuller .
Fra cp
man-siden i OS X og gamle versjoner av 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 versjoner av FreeBSD tilsvarer -r
-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, kopierer du innholdet i spesielle filer (f.eks. FIFOer og enhetsfiler) som om det var vanlige filer. Dette betyr å prøve å lese dataene i hver kildefil og skrive dem til destinasjonen. Det er vanligvis en feil å bruke dette alternativet, ettersom det normalt har uønskede effekter på spesielle filer som FIFOer og de som vanligvis finnes i
/dev
-katalogen.I de fleste tilfeller vilcp -R --copy-contents
henge på ubestemt tid og prøve å lese fra FIFOer og spesielle filer som/dev/console
, og det vil fylle opp måldisken din hvis du bruker den til å kopiere/dev/zero
. Dette alternativet har ingen effekt med mindre du kopierer rekursivt, og det påvirker ikke kopieringen av symbolske lenker.
Svar
en av forskjellen jeg fant at -r ikke kopier skjulte kataloger mens -R kopier skjulte kataloger.
Jeg testet den .git-katalogen i målkatalogen og kom til konklusjonen ovenfor. Jeg bruker for øyeblikket centOS.
Det kan hende jeg tar feil, men det er åpent for diskusjon.
Kommentarer
- Jeg har ikke ‘ t se dette på CentOS 5;
-r
og-R
begge kopierer skjulte kataloger
Legg igjen en kommentar