Rozdíl mezi cp -r a cp -R (příkaz pro kopírování)
On 18 února, 2021 by admin cp -r
má kopírovat soubory rekurzivně, a cp -R
pro rekurzivní kopírování adresářů. Ale zkontroloval jsem to a zdá se, že oba kopírují soubory i adresáře, totéž. Jaký je tedy vlastně rozdíl?
Komentáře
- Každá zmínka o těchto možnostech v příručkách k systému Linux říká, že ‚ jsou synonyma. (‚ nepoužívají jiné varianty unixu.)
Odpovědět
Zatímco -R
je posix dobře definovaný, -r
není přenosný!
V systému Linux v implementace GNU a BusyBox cp
, -r
a -R
jsou ekvivalentní.
Na druhé straně, jak si můžete přečíst na POSIX manuální stránce cp
, -r
chování je definované implementací .
* 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.
Komentáře
- Jedním z rozdílů by bylo, že například v OSX
-r
zkopíruje skutečné soubory označené symbolickými odkazy, zatímco-R
bude zkopírujte symbolický odkaz, který je po většinu času zamýšlen.
Odpověď
Malá písmena -r
byla starší možnost představená v 4.1BSD, která by jednoduše zkopírovala všechny jiné než adresáře jako soubory. To znamená, že pokud narazilo na zařízení nebo FIFO, otevřelo by ho, přečetlo obsah a vytvořilo soubor v cílovém umístění s obsahem.
Velká písmena -R
byla standardizovaná možnost (zavedená do BSD v 4.4BSD, ačkoli dřívější verze ji používaly jako synonymum pro -r
), která by při setkání se zařízením, FIFO nebo jiným speciálním souborem vytvořte ekvivalentní speciální soubor v cíli.
Mnoho implementací si stále zachovává tento rozdíl, ale některé (včetně GNU verze typické pro Linux) poskytují pouze -R
sémantika se synonymem -r
.
Odpověď
Rozdíl je v tom, že jeden používá malé písmeno „R“ a druhé velké písmeno „R“. Kromě toho žádný rozdíl. Totéž, pokud použijete možnost --recursive
long.
Komentáře
- Z manuálové stránky: – R, -r, –recursive – kopírování adresářů rekurzivně
- @DaveJennings: To, že jsou na jedné platformě ekvivolentní, neznamená, že jsou ‚ všechny. U některých implementací
cp
skutečně existuje rozdíl. Viz Random832 ‚ s odpovědí . @Ignacio byste do této odpovědi měli zahrnout kvalifikátor, který říká “ pokud je vašecp
moderní implementace GNU “ nebo něco podobného. - @Caleb: Otázka je označena “ linux „. Co jiného by to bylo?
- -R a -r se u některých systémů, které používám, liší (OS X, FreeBSD, BusyBox coreutils; momentálně si nejsem jistý). Už dávno jsem se rozhodl, že je rozumné vždy používat pouze
-R
a ve skutečnosti to doporučují i některé z manuálových stránek v systémech, které jsme právě zmínili.
Odpověď
V OS X a starších verzích FreeBSD -r
je jako -R -L --copy-contents
v coreutils, nebo sleduje symboly a čte obsah speciálních souborů a souborů FIFO.
mkdir a;touch b;ln -s $PWD/b a;cp -r a c
nahradí symbolický odkaz cílovým souborem v OS X, mkdir a;mkfifo a/b;cp -r a c
zablokuje čtení FIFO a mkdir a;ln -s /dev/zero a;cp -r a b
začne plnit b/zero
nulami .
Na cp
man stránce v OS X a starších verzích 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.
V nových verzích FreeBSD je -r
ekvivalent -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
Pokud kopírujete rekurzivně, zkopírujte obsah jakýchkoli speciálních souborů (např. FIFO a soubory zařízení), jako by to byly běžné soubory. To znamená pokusit se načíst data v každém zdrojovém souboru a zapsat je do cíle. Je obvykle chybou použít tuto možnost, protože obvykle má nežádoucí účinky na speciální soubory, jako jsou FIFO a ty, které se obvykle nacházejí v adresáři
/dev
.Ve většině případůcp -R --copy-contents
bude viset na neurčito a pokusí se číst z FIFO a speciálních souborů, jako je/dev/console
, a zaplní váš cílový disk, pokud použijete jej ke kopírování/dev/zero
. Tato možnost nemá žádný účinek, pokud nekopíruje rekurzivně, a nemá vliv na kopírování symbolických odkazů.
Odpověď
jeden z rozdílů, který jsem zjistil, že -r ne kopírovat skryté adresáře, zatímco -R kopíruje skryté adresáře.
Testoval jsem to .git adresář v cílovém adresáři a dospěl jsem k výše uvedenému závěru. Používám aktuálně centOS.
Možná se mýlím, ale je to otevřené diskusi.
Komentáře
- ne ‚ toto nevidíte v CentOS 5;
-r
a-R
oba kopírují skryté adresáře
Napsat komentář