Різниця між cp -r і cp -R (команда копіювання)


60

cp -rпризначений для копіювання файлів рекурсивно, а cp -Rдля копіювання каталогів рекурсивно. Але я перевірив, і, здається, обидва копіюють і файли, і каталоги, те саме. Отже, яка різниця насправді?


2
Кожна згадка про ці параметри в посібниках Linux говорить про те, що вони є синонімами. (Вони не в інших варіантах Unix.)
Жил,

Відповіді:


74

Хоча -Rposix добре визначений, -rвін не є портативним!

У Linux, в реалізації GNU і BusyBox з cp, -rі -Rеквівалентні.

З іншого боку, як ви можете прочитати на сторінці керівництва POSIXcp , -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.

14
Однією з відмінностей буде те, що, наприклад, в OSX, -rбуде скопійовано реальні файли, вказані символічними посиланнями, а -Rкопіюється символічне посилання, яке саме призначене більшість разів.
nacho4d

19

Різниця полягає в тому, що один використовує малий "R", а другий використовує велику "R". Крім цього, різниці немає. Те ж саме, якщо ви використовуєте --recursiveдовгий варіант.


4
З чоловічої сторінки: -R, -r, --рекурсивна - копіювати каталоги рекурсивно
Дейв Дженнінгс

6
@DaveJennings: Тільки тому, що вони є рівносильними на одній платформі, не означає, що вони є на всіх. У деяких реалізаціях cpнасправді існує відмінність. Дивіться відповідь Random832 . @Ignacio, ви повинні включити у цю відповідь кваліфікатора, який говорить "якщо ваша cpсучасна реалізація GNU" або щось подібне.
Калеб

@Caleb: Питання позначено тегом "linux". Що ще було б?
Ігнасіо Васкес-Абрамс

3
-R і -r дають різну поведінку в деяких системах, які я використовую (OS X, FreeBSD, BusyBox coreutils; не впевнені, які саме на даний момент). Я давно вирішив, що доцільно завжди використовувати -Rлише це, і насправді деякі з цих сторінок у згаданих системах також рекомендують це.
сумнівним

17

Нижній регістр -rбув старшим варіантом, введеним в 4.1BSD, який просто копіював би всі не-каталоги як файли. Тобто, якщо він зіткнувся з пристроєм або FIFO, він відкрив би його, прочитав вміст і створив файл за призначенням із вмістом.

Верхній регістр -R- це стандартизований варіант (введений до BSD в 4.4BSD, хоча в попередніх версіях він був синонімом до -r), який, зустрівши пристрій, FIFO або інший спеціальний файл, створить еквівалентний спеціальний файл у пункті призначення.

Багато реалізацій все ще зберігають цю відмінність, але деякі (включаючи типові для Linux версії GNU) надають лише -Rсемантику -rяк синонім.


3

В OS X і старих версіях FreeBSD -rподібний -R -L --copy-contentsдо coreutils, або він слідує за посиланнями і читає вміст спеціальних файлів і FIFO.

mkdir a;touch b;ln -s $PWD/b a;cp -r a cзамінює симпосилання на цільовий файл в OS X, mkdir a;mkfifo a/b;cp -r a cблокується читання FIFO та mkdir a;ln -s /dev/zero a;cp -r a bпочинає заповнювати b/zeroнулі.

На cpголовній сторінці в OS X та старих версіях 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.

У нових версіях FreeBSD -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

Якщо копіюється рекурсивно, скопіюйте вміст будь-яких спеціальних файлів (наприклад, файлів FIFO та файлів пристроїв) так, ніби вони були звичайними файлами. Це означає спробувати прочитати дані у кожному вихідному файлі та записати їх до місця призначення. Зазвичай помилково використовувати цю опцію, оскільки вона зазвичай має небажані ефекти для спеціальних файлів, таких як FIFO, та тих, які зазвичай знаходяться в /devкаталозі. У більшості випадків він cp -R --copy-contentsбуде нескінченно висіти, намагаючись читати з FIFO та спеціальних файлів, таких як /dev/console, і він заповнить ваш цільовий диск, якщо ви використовуєте його для копіювання /dev/zero. Цей параметр не має ефекту, якщо не копіюється рекурсивно, і це не впливає на копіювання символічних посилань.


-1

одна з різниць я виявив, що -r не копіює приховані каталоги, тоді як -R копіює приховані каталоги.

Я перевірив його .git-каталог у цільовому каталозі і дійшов вище висновку. Я зараз використовую centOS.

Я можу помилятися, але це відкрито для обговорення.


4
Я не бачу цього на CentOS 5; -rі -Rобидва копіюють приховані каталоги
Michael Mrozek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.