Der Unterschied zwischen cp -r und cp -R (Kopierbefehl)
On Februar 18, 2021 by admin 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, also, was ist eigentlich der Unterschied?
Kommentare
- Jede Erwähnung dieser Optionen in den Linux-Handbüchern besagt, dass sie ‚ Synonyme sind. (Sie ‚ befinden sich nicht in einigen anderen Unix-Varianten.)
Antwort
Während -R
gut definiert ist, ist -r
nicht portierbar!
Unter Linux in Die GNU- und BusyBox-Implementierungen von cp
, -r
und -R
sind äquivalent.
Auf der anderen Seite, wie Sie in der POSIX -Handbuchseite von cp
lesen können , -r
Verhalten ist implementierungsdefiniert .
* 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.
Kommentare
- Einer der Unterschiede wäre, dass beispielsweise in OSX
-r
die realen Dateien kopiert, auf die durch symbolische Links verwiesen wird, während-R
dies tut Kopieren Sie den symbolischen Link, der meistens beabsichtigt ist.
Antwort
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, öffnet es es, liest den Inhalt und erstellt am Zielort eine Datei mit dem Inhalt.
Großbuchstaben -R
war eine standardisierte Option (eingeführt in BSD in 4.4BSD, 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 GNU-Version) bieten nur die -R
Semantik mit -r
als Synonym.
Antwort
Der Unterschied besteht darin einer verwendet ein Kleinbuchstaben „R“ und der andere ein Großbuchstaben „R“. Darüber hinaus kein Unterschied. Dasselbe gilt, wenn Sie die Option --recursive
long verwenden.
Kommentare
- Auf der Manpage: – R, -r, –recursive – Verzeichnisse rekursiv kopieren
- @DaveJennings: Nur weil sie auf einer Plattform gleichwertig sind, bedeutet ‚ nicht, dass sie auf allen vorhanden sind. Bei einigen Implementierungen von
cp
gibt es tatsächlich eine Unterscheidung. Siehe Random832 ‚ s Antwort . @Ignacio Sie sollten ein Qualifikationsmerkmal in diese Antwort aufnehmen, das “ lautet, wenn Ihrecp
die moderne GNU-Implementierung oder so ähnlich. - @Caleb: Die Frage ist mit “ linux “ gekennzeichnet. Was wäre es sonst?
- -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 nur
-R
zu verwenden, und tatsächlich empfehlen einige der Manpages auf den gerade erwähnten Systemen dies auch.
Antwort
In OS X und alten Versionen von FreeBSD -r
entspricht -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
beginnt, b/zero
mit Nullen zu füllen .
Auf 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 aller speziellen 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
zu finden sind.In den meisten Fällen bleibtcp -R --copy-contents
unbegrenzt hängen und versucht, aus FIFOs und speziellen Dateien wie/dev/console
zu lesen, und füllt Ihre Zieldiskette aus, wenn Sie verwenden es, um/dev/zero
zu kopieren. Diese Option hat keine Auswirkung, es sei denn, sie wird rekursiv kopiert, und sie wirkt sich nicht auf das Kopieren symbolischer Links aus.
Antwort
Einer der Unterschiede, die ich festgestellt habe, ist -r nicht Versteckte Verzeichnisse kopieren, während -R versteckte Verzeichnisse kopiert.
Ich habe das .git-Verzeichnis im Zielverzeichnis getestet und bin zu dem obigen Schluss gekommen. Ich verwende derzeit centOS.
Ich kann mich irren, aber es ist offen für Diskussionen.
Kommentare
- Ich ziehe an ‚ wird unter CentOS 5 nicht angezeigt.
-r
und-R
kopieren beide versteckte Verzeichnisse
Schreibe einen Kommentar