Różnica między cp -r a cp -R (polecenie kopiowania)
60
cp -rsłuży do rekurencyjnego kopiowania plików oraz cp -Rdo rekurencyjnego kopiowania katalogów. Ale sprawdziłem i oba wydają się kopiować zarówno pliki, jak i katalogi, to samo. Jaka jest właściwie różnica?
Każda wzmianka o tych opcjach w instrukcjach Linuksa mówi, że są one synonimami. (Nie ma ich w niektórych innych wariantach unixowych).
Gilles
Odpowiedzi:
74
Chociaż -Rposix jest dobrze zdefiniowany, -rnie jest przenośny!
W systemie Linux, w implementacji GNU i BusyBox z cp, -ri -Rsą równoważne.
Z drugiej strony, jak można przeczytać na stronie podręcznika POSIXcp , -rzachowanie jest zdefiniowane w implementacji .
* 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.
Jedną z różnic byłoby to, że na przykład w OSX -rskopiuje rzeczywiste pliki wskazane przez dowiązania symboliczne, podczas gdy -Rskopiuje dowiązanie symboliczne, które jest zamierzone przez większość czasu.
nacho4d
19
Różnica polega na tym, że jedna używa małej litery „R”, a druga używa dużej litery „R”. Poza tym nie ma różnicy. To samo, jeśli użyjesz --recursivedługiej opcji.
Ze strony podręcznika: -R, -r, --recursive - kopiuj katalogi rekurencyjnie
Dave Jennings
6
@DaveJennings: To, że są równorzędne na jednej platformie, nie oznacza, że są na wszystkich. W niektórych implementacjach cpistnieje rozróżnienie. Zobacz odpowiedź Random832 . @Ignacio powinieneś dołączyć kwalifikator do tej odpowiedzi, który mówi „jeśli twoja cpnowoczesna implementacja GNU” lub coś takiego.
Caleb,
@Caleb: Pytanie oznaczone jest jako „linux”. Co jeszcze by to było?
Ignacio Vazquez-Abrams,
3
-R i -r dają różne zachowanie w niektórych systemach, których używam (OS X, FreeBSD, BusyBox coreutils; nie jestem pewien, które z nich w tej chwili). Zdecydowałem już dawno, że rozsądne jest zawsze używać -Rtylko i faktycznie niektóre strony podręcznika systemowego w wymienionych systemach również to zalecają.
dubiousjim
17
Małe litery -rbyły starszą opcją, wprowadzoną w 4.1BSD, która po prostu kopiowała wszystkie pliki niebędące katalogami jako pliki. Oznacza to, że jeśli napotka urządzenie lub FIFO, otworzy je, przeczyta zawartość i utworzy plik w miejscu docelowym z zawartością.
Wielkie litery -Rbyły znormalizowaną opcją (wprowadzoną do BSD w 4.4BSD, chociaż wcześniejsze wersje miały to jako synonim -r), która po napotkaniu urządzenia, FIFO lub innego pliku specjalnego utworzyłaby równoważny plik specjalny w miejscu docelowym.
Wiele implementacji wciąż utrzymuje to rozróżnienie, ale niektóre (w tym typowa dla Linuksa wersja GNU) podają tylko -Rsemantykę, -rjako synonim.
W OS X i starych wersjach FreeBSD -rjest jak -R -L --copy-contentsw coreutils, lub podąża za dowiązaniami symbolicznymi i odczytuje zawartość specjalnych plików i FIFO.
mkdir a;touch b;ln -s $PWD/b a;cp -r a czastępuje dowiązanie symboliczne plikiem docelowym w OS X, mkdir a;mkfifo a/b;cp -r a czostaje zablokowany odczyt FIFO i mkdir a;ln -s /dev/zero a;cp -r a bzaczyna się wypełniać b/zerozerami.
Ze strony podręcznika cpw OS X i starych wersjach 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.
W nowych wersjach FreeBSD -rodpowiada -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.
Jeśli kopiujesz rekurencyjnie, skopiuj zawartość dowolnych plików specjalnych (np. FIFO i plików urządzeń) tak, jakby były zwykłymi plikami. Oznacza to próbę odczytania danych w każdym pliku źródłowym i zapisania ich w miejscu docelowym. Zazwyczaj błędem jest użycie tej opcji, ponieważ zwykle ma niepożądane skutki dla specjalnych plików, takich jak FIFO i zwykle znajdujących się w /devkatalogu. W większości przypadków cp -R --copy-contentszawiesi się na czas nieokreślony, próbując czytać z FIFO i specjalnych plików, takich jak /dev/console, i zapełni dysk docelowy, jeśli użyjesz go do kopiowania /dev/zero. Ta opcja nie działa, chyba że kopiuje się rekurencyjnie i nie wpływa na kopiowanie dowiązań symbolicznych.
Odpowiedzi:
Chociaż
-R
posix jest dobrze zdefiniowany,-r
nie jest przenośny!W systemie Linux, w implementacji GNU i BusyBox z
cp
,-r
i-R
są równoważne.Z drugiej strony, jak można przeczytać na stronie podręcznika POSIX
cp
,-r
zachowanie jest zdefiniowane w implementacji .źródło
-r
skopiuje rzeczywiste pliki wskazane przez dowiązania symboliczne, podczas gdy-R
skopiuje dowiązanie symboliczne, które jest zamierzone przez większość czasu.Różnica polega na tym, że jedna używa małej litery „R”, a druga używa dużej litery „R”. Poza tym nie ma różnicy. To samo, jeśli użyjesz
--recursive
długiej opcji.źródło
cp
istnieje rozróżnienie. Zobacz odpowiedź Random832 . @Ignacio powinieneś dołączyć kwalifikator do tej odpowiedzi, który mówi „jeśli twojacp
nowoczesna implementacja GNU” lub coś takiego.-R
tylko i faktycznie niektóre strony podręcznika systemowego w wymienionych systemach również to zalecają.Małe litery
-r
były starszą opcją, wprowadzoną w 4.1BSD, która po prostu kopiowała wszystkie pliki niebędące katalogami jako pliki. Oznacza to, że jeśli napotka urządzenie lub FIFO, otworzy je, przeczyta zawartość i utworzy plik w miejscu docelowym z zawartością.Wielkie litery
-R
były znormalizowaną opcją (wprowadzoną do BSD w 4.4BSD, chociaż wcześniejsze wersje miały to jako synonim-r
), która po napotkaniu urządzenia, FIFO lub innego pliku specjalnego utworzyłaby równoważny plik specjalny w miejscu docelowym.Wiele implementacji wciąż utrzymuje to rozróżnienie, ale niektóre (w tym typowa dla Linuksa wersja GNU) podają tylko
-R
semantykę,-r
jako synonim.źródło
W OS X i starych wersjach FreeBSD
-r
jest jak-R -L --copy-contents
w coreutils, lub podąża za dowiązaniami symbolicznymi i odczytuje zawartość specjalnych plików i FIFO.mkdir a;touch b;ln -s $PWD/b a;cp -r a c
zastępuje dowiązanie symboliczne plikiem docelowym w OS X,mkdir a;mkfifo a/b;cp -r a c
zostaje zablokowany odczyt FIFO imkdir a;ln -s /dev/zero a;cp -r a b
zaczyna się wypełniaćb/zero
zerami.Ze strony podręcznika
cp
w OS X i starych wersjach FreeBSD:W nowych wersjach FreeBSD
-r
odpowiada-RL
:http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html :
źródło
jedną z różnic stwierdziłem, że -r nie kopiuje ukrytych katalogów, podczas gdy -R kopiuje ukryte katalogi.
Przetestowałem go .git w katalogu docelowym i doszedłem do powyższego wniosku. Korzystam obecnie z centOS.
Mogę się mylić, ale jest otwarta na dyskusję.
źródło
-r
i-R
oba kopiują ukryte katalogi