it-swarm-ru.tech

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

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

63
its_me

Пока -R имеет четкое определение, -r не переносимо!

В Linux в реализациях GNU и BusyBox cp, -r а также -R эквивалентны.

С другой стороны, как вы можете прочитать на странице руководства POSIX cp, -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.
76
andcoz

Строчные буквы -r был более старой опцией, представленной в 4.1BSD, которая просто копировала все не-каталоги в виде файлов. То есть, если он обнаружит устройство или FIFO, он откроет его, прочитает содержимое и создаст файл в месте назначения с содержимым.

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

Многие реализации все еще поддерживают это различие, но некоторые (включая GNU, типичная для Linux) предоставляют только -R семантика, с -r как синоним.

19
Random832

Разница в том, что один использует строчную букву "R", а другой - заглавную "R". Помимо этого, нет разницы. То же самое, если вы используете --recursive длинный вариант.

18
Ignacio Vazquez-Abrams

В 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. Эта опция не имеет никакого эффекта, кроме как при рекурсивном копировании, и не влияет на копирование символических ссылок.

3
Lri