Het verschil tussen cp -r en cp -R (kopieeropdracht)
Geplaatst op februari 18, 2021 door admin cp -r
is bedoeld om bestanden recursief te kopiëren, en cp -R
voor het recursief kopiëren van mappen. Maar ik heb het gecontroleerd, en beide lijken zowel bestanden als mappen te kopiëren, hetzelfde. Dus, wat is eigenlijk het verschil?
Reacties
- Elke vermelding van deze opties in de Linux-handleidingen zegt dat ze ‘ synoniemen zijn. (Ze ‘ zijn niet op sommige andere Unix-varianten.)
Antwoord
Hoewel -R
posix goed gedefinieerd is, is -r
niet draagbaar!
Op Linux, in de GNU- en BusyBox-implementaties van cp
, -r
en -R
zijn equivalent.
Aan de andere kant, zoals je kunt lezen in de POSIX man-pagina van cp
, -r
gedrag is implementatie-gedefinieerd .
* 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.
Reacties
- Een van de verschillen zou zijn dat, in OSX bijvoorbeeld,
-r
de echte bestanden kopieert die door symbolische links worden aangeduid, terwijl-R
kopieer de symbolische link, zoals deze meestal bedoeld is.
Answer
Kleine letters -r
was een oudere optie, geïntroduceerd in 4.1BSD, die eenvoudig alle niet-mappen als bestanden zou kopiëren. Dat wil zeggen, als het een apparaat of FIFO zou tegenkomen, zou het het openen, de inhoud lezen en een bestand maken op de bestemming met de inhoud.
Hoofdletters -R
was een gestandaardiseerde optie (geïntroduceerd in BSD in 4.4BSD, hoewel eerdere versies het als synoniem hadden voor -r
) die bij het tegenkomen van een apparaat, FIFO of ander speciaal bestand, maak een equivalent speciaal bestand op de bestemming.
Veel implementaties behouden dit onderscheid nog steeds, maar sommige (inclusief de GNU-versie die typisch is voor Linux) bieden alleen de -R
semantiek, met -r
als synoniem.
Antwoord
Het verschil is dat de ene gebruikt een kleine “R” en de andere gebruikt een hoofdletter “R”. Verder geen verschil. Hetzelfde als je de --recursive
lange optie gebruikt.
Reacties
- Van de man-pagina: – R, -r, –recursive – kopieer directories recursief
- @DaveJennings: alleen omdat ze gelijkwaardig zijn op één platform betekent niet ‘ niet dat ze op allemaal staan. Bij sommige implementaties van
cp
is er eigenlijk een onderscheid. Bekijk Random832 ‘ s antwoord . @Ignacio je zou in dit antwoord een kwalificatie moeten opnemen die ” zegt als jecp
de moderne GNU-implementatie is ” of iets dergelijks. - @Caleb: de vraag is getagd met ” linux “. Wat zou het anders zijn?
- -R en -r vertonen ander gedrag op sommige van de systemen die ik gebruik (OS X, FreeBSD, BusyBox coreutils; ik weet niet zeker welke op dit moment). Ik besloot lang geleden dat het verstandig was om altijd alleen
-R
te gebruiken, en in feite bevelen sommige man-paginas op de zojuist genoemde systemen dat ook aan.
Answer
In OS X en oude versies van FreeBSD is -r
vergelijkbaar met -R -L --copy-contents
in coreutils, of het volgt symlinks en leest de inhoud van speciale bestanden en FIFOs.
mkdir a;touch b;ln -s $PWD/b a;cp -r a c
vervangt de symlink door het doelbestand in OS X, mkdir a;mkfifo a/b;cp -r a c
wordt geblokkeerd bij het lezen van de FIFO en mkdir a;ln -s /dev/zero a;cp -r a b
begint b/zero
met nullen te vullen .
Van de cp
man-pagina in OS X en oude versies van 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.
In nieuwe versies van FreeBSD is -r
gelijk aan -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
Als u recursief kopieert, kopieer dan de inhoud van speciale bestanden (bijv. FIFOs en apparaatbestanden) alsof het gewone bestanden zijn. Dit betekent dat u probeert de gegevens in elk bronbestand te lezen en naar de bestemming te schrijven. Het is meestal een vergissing om deze optie te gebruiken, aangezien het normaal gesproken ongewenste effecten heeft op speciale bestanden zoals FIFOs en diegene die doorgaans worden aangetroffen in de
/dev
directory.In de meeste gevallen zalcp -R --copy-contents
voor onbepaalde tijd hangen bij het lezen van FIFOs en speciale bestanden zoals/dev/console
, en het zal je bestemmingsschijf vullen als je gebruikt het om/dev/zero
te kopiëren. Deze optie heeft geen effect, tenzij recursief wordt gekopieerd, en heeft geen invloed op het kopiëren van symbolische koppelingen.
Antwoord
een van de verschillen vond ik dat -r niet kopieer verborgen mappen terwijl -R verborgen mappen kopieert.
Ik heb de .git-map in de doelmap getest en kwam tot bovenstaande conclusie. Ik gebruik momenteel centOS.
Misschien heb ik het mis, maar het staat open voor discussie.
Reacties
- Ik don ‘ zie dit niet op CentOS 5;
-r
en-R
kopiëren beide verborgen mappen
Geef een reactie