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?

to ja
źródło
2
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.
andcoz
źródło
14
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.

Ignacio Vazquez-Abrams
źródło
4
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.

Losowo 832
źródło
3

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.

http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html :

--copy-contents

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.

Lri
źródło
-1

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

Zeel SHah
źródło
4
Nie widzę tego na CentOS 5; -ri -Roba kopiują ukryte katalogi
Michael Mrozek