cp -r
dient zum rekursiven Kopieren von Dateien und cp -R
zum 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?
cp -r
dient zum rekursiven Kopieren von Dateien und cp -R
zum 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?
Antworten:
Während -R
posix gut definiert ist, -r
ist nicht portabel!
Unter Linux in dem GNU und BusyBox - Implementierungen cp
, -r
und -R
sind 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.
-r
die realen Dateien kopiert werden, auf die durch symbolische Links verwiesen wird, während -R
der symbolische Link kopiert wird, was meistens beabsichtigt ist.
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 --recursive
Option long verwenden.
cp
gibt es tatsächlich einen Unterschied. Siehe Random832s Antwort . @Ignacio Du solltest ein Qualifikationsmerkmal in diese Antwort einfügen, das besagt "Wenn cp
es sich um die moderne GNU-Implementierung handelt" oder so ähnlich.
-R
nur zu verwenden, und in der Tat empfehlen einige der Manpages auf den eben erwähnten Systemen dies auch.
Kleinbuchstaben -r
waren 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 -R
waren 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 -R
Semantik -r
als Synonym an.
In OS X und älteren Versionen von FreeBSD -r
ist es 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 mit der Zieldatei in OS X, mkdir a;mkfifo a/b;cp -r a c
blockiert das Lesen des FIFO und mkdir a;ln -s /dev/zero a;cp -r a b
beginnt mit dem Füllen b/zero
mit Nullen.
Von der cp
Manpage 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 -r
ist ä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
/dev
Verzeichnis gefunden werden. In den meisten Fällencp -R --copy-contents
bleibt der Versuch, aus FIFOs und speziellen Dateien wie zu lesen , auf unbestimmte Zeit hängen/dev/console
und 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.
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.
-r
und -R
beide kopieren versteckte Verzeichnisse