Unterschied zwischen cp -r und cp -R (Kopierbefehl)


60

cp -rdient zum rekursiven Kopieren von Dateien und cp -Rzum rekursiven Kopieren von Verzeichnissen. Aber ich habe geprüft, und beide scheinen beide Dateien und Verzeichnisse zu kopieren, die gleiche Sache. Was ist der Unterschied?


2
Jede Erwähnung dieser Optionen in den Linux-Handbüchern besagt, dass sie Synonyme sind. (Sie sind nicht auf einigen anderen Unix-Varianten.)
Gilles 'SO - hör auf, böse zu sein'

Antworten:


74

Während -Rposix gut definiert ist, -rist nicht portabel!

Unter Linux in dem GNU und BusyBox - Implementierungen cp, -rund -Rsind gleichwertig.

Auf der anderen Seite ist das Verhalten , wie Sie in der POSIX- Handbuchseite von nachlesen können cp, implementierungsdefiniert .-r

    * 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.

14
Einer der Unterschiede wäre, dass in OSX zum Beispiel -rdie realen Dateien kopiert werden, auf die durch symbolische Links verwiesen wird, während -Rder symbolische Link kopiert wird, was meistens beabsichtigt ist.
Nacho4d

19

Der Unterschied besteht darin, dass einer ein kleines "R" und der andere ein großes "R" verwendet. Darüber hinaus kein Unterschied. Dasselbe gilt, wenn Sie die --recursiveOption long verwenden.


4
Von der Manpage: -R, -r, --recursive - Verzeichnisse rekursiv kopieren
Dave Jennings

6
@ DaveJennings: Nur weil sie auf einer Plattform gleichwertig sind, heißt das nicht, dass sie auf allen Plattformen sind. Bei einigen Implementierungen cpgibt es tatsächlich einen Unterschied. Siehe Random832s Antwort . @Ignacio Du solltest ein Qualifikationsmerkmal in diese Antwort einfügen, das besagt "Wenn cpes sich um die moderne GNU-Implementierung handelt" oder so ähnlich.
Caleb

@Caleb: Die Frage ist mit "Linux" markiert. Was wäre es noch?
Ignacio Vazquez-Abrams

3
-R und -r verhalten sich auf einigen der von mir verwendeten Systeme unterschiedlich (OS X, FreeBSD, BusyBox-Coreutils; nicht sicher, welche im Moment). Ich habe vor langer Zeit entschieden, dass es ratsam ist, immer -Rnur zu verwenden, und in der Tat empfehlen einige der Manpages auf den eben erwähnten Systemen dies auch.
dubiousjim

17

Kleinbuchstaben -rwaren eine ältere Option, die in 4.1BSD eingeführt wurde und alle Nicht-Verzeichnisse einfach als Dateien kopierte. Das heißt, wenn ein Gerät oder ein FIFO gefunden wird, wird es geöffnet, der Inhalt gelesen und am Ziel eine Datei mit dem Inhalt erstellt.

Großbuchstaben -Rwaren eine standardisierte Option (eingeführt in BSD in 4.4BSD, obwohl frühere Versionen sie als Synonym hatten -r), die beim Auffinden eines Geräts, eines FIFO oder einer anderen speziellen Datei eine äquivalente spezielle Datei am Zielort erzeugen würde.

Viele Implementierungen behalten diese Unterscheidung noch bei, aber einige (einschließlich der für Linux typischen GNU-Version) bieten nur die -RSemantik -rals Synonym an.


3

In OS X und älteren Versionen von FreeBSD -rist es wie -R -L --copy-contentsin coreutils, oder es folgt symlinks und liest den Inhalt spezieller Dateien und FIFOs.

mkdir a;touch b;ln -s $PWD/b a;cp -r a cErsetzt den Symlink mit der Zieldatei in OS X, mkdir a;mkfifo a/b;cp -r a cblockiert das Lesen des FIFO und mkdir a;ln -s /dev/zero a;cp -r a bbeginnt mit dem Füllen b/zeromit Nullen.

Von der cpManpage in OS X und alten Versionen von 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 neuen Versionen von FreeBSD -rist äquivalent zu -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

Kopieren Sie beim rekursiven Kopieren den Inhalt von speziellen Dateien (z. B. FIFOs und Gerätedateien) wie normale Dateien. Dies bedeutet, dass Sie versuchen, die Daten in jeder Quelldatei zu lesen und in das Ziel zu schreiben. Es ist normalerweise ein Fehler, diese Option zu verwenden, da sie normalerweise unerwünschte Auswirkungen auf spezielle Dateien wie FIFOs und solche hat, die normalerweise im /devVerzeichnis gefunden werden. In den meisten Fällen cp -R --copy-contentsbleibt der Versuch, aus FIFOs und speziellen Dateien wie zu lesen , auf unbestimmte Zeit hängen /dev/consoleund füllt die Zieldiskette, wenn Sie sie zum Kopieren verwenden /dev/zero. Diese Option hat keine Auswirkung, es sei denn, sie wird rekursiv kopiert, und sie wirkt sich nicht auf das Kopieren von symbolischen Links aus.


-1

Einer der Unterschiede war, dass -r keine versteckten Verzeichnisse kopiert, während -R versteckte Verzeichnisse kopiert.

Ich habe das .git-Verzeichnis im Zielverzeichnis getestet und bin zu dem obigen Ergebnis gekommen. Ich benutze derzeit centOS.

Ich kann mich irren, aber es ist offen für Diskussionen.


4
Ich sehe das nicht auf CentOS 5; -rund -Rbeide kopieren versteckte Verzeichnisse
Michael Mrozek
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.