it-swarm.com.de

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

cp -r soll Dateien rekursiv kopieren, und cp -R zum rekursiven Kopieren von Verzeichnissen. Aber ich habe überprüft, und beide scheinen sowohl Dateien als auch Verzeichnisse zu kopieren, dasselbe. Also, was ist der Unterschied eigentlich?

63
its_me

Während -R Posix genau definiert ist, ist -r Nicht portierbar!

Unter Linux sind in den Implementierungen GNU und BusyBox von cp, -r Und -R Äquivalent.

Auf der anderen Seite ist, wie Sie in der POSIX Handbuchseite von cp lesen können, das Verhalten von -rimplementation-defined.

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

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

Großbuchstaben -R War eine standardisierte Option (in BSD in 4.4BSD eingeführt, obwohl frühere Versionen sie als Synonym für -r Hatten), die bei Begegnung mit einem Gerät, einem FIFO oder einer anderen speziellen Datei Erstellen Sie am Zielort eine entsprechende Spezialdatei.

Viele Implementierungen behalten diese Unterscheidung bei, aber einige (einschließlich der für Linux typischen Version GNU Version)) bieten nur die Semantik -R Mit -r Als Synonym.

19
Random832

Der Unterschied besteht darin, dass einer ein Kleinbuchstaben "R" und der andere ein Großbuchstaben "R" verwendet. Darüber hinaus kein Unterschied. Gleiches gilt, wenn Sie das --recursive lange Option.

In OS X und alten Versionen von FreeBSD ist -r Wie -R -L --copy-contents In 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 c Ersetzt den Symlink durch die Zieldatei in OS X, mkdir a;mkfifo a/b;cp -r a c Wird beim Lesen des FIFO blockiert und mkdir a;ln -s /dev/zero a;cp -r a b Fängt an, b/zero Mit Nullen zu füllen.

Von der Manpage cp 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 entspricht -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

Wenn Sie rekursiv kopieren, kopieren Sie den Inhalt spezieller Dateien (z. B. FIFOs und Gerätedateien) so, als wären sie reguläre 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 diejenigen hat, die normalerweise im Verzeichnis /dev Gefunden werden. In den meisten Fällen bleibt cp -R --copy-contents Auf unbestimmte Zeit hängen und versucht, aus FIFOs und speziellen Dateien wie /dev/console Zu lesen, und füllt Ihre Zieldiskette, wenn Sie damit /dev/zero Kopieren. Diese Option hat keine Auswirkung, es sei denn, sie wird rekursiv kopiert, und sie wirkt sich nicht auf das Kopieren symbolischer Links aus.

3
Lri