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

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

<p>пока <code>-r</code> имеет четкое определение, <code>-r</code> не переносимо!</p><p>в linux в реализациях gnu и busybox <code>cp</code>, <code>-r</code> а также <code>-r</code> эквивалентны.</p><p>с другой стороны, как вы можете прочитать на странице руководства <a href="http://pubs.opengroup.org/onlinepubs/009695399/utilities/cp.html"> posix </a> <code>cp</code>, <code>-r</code> поведение <strong> определяется реализацией </strong>.</p><blockquote> <pre><code> * 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. </code></pre></blockquote>

<p>строчные буквы <code>-r</code> был более старой опцией, представленной в 4.1bsd, которая просто копировала все не-каталоги в виде файлов. то есть, если он обнаружит устройство или fifo, он откроет его, прочитает содержимое и создаст файл в месте назначения с содержимым.</p><p>верхний регистр <code>-r</code> был стандартизированным вариантом (введен в bsd в 4.4bsd, хотя в более ранних версиях он был синонимом <code>-r</code>) который при обнаружении устройства, fifo или другого специального файла создает эквивалентный специальный файл в месте назначения.</p><p>многие реализации все еще поддерживают это различие, но некоторые (включая gnu, типичная для linux) предоставляют только <code>-r</code> семантика, с <code>-r</code> как синоним.</p>

<p>разница в том, что один использует строчную букву "r", а другой - заглавную "r". помимо этого, нет разницы. то же самое, если вы используете <code>--recursive</code> длинный вариант.</p>

<p>в os x и старых версиях freebsd <code>-r</code> как <code>-r -l --copy-contents</code> в coreutils, либо следует по символическим ссылкам и читает содержимое специальных файлов и файлов fifo.</p><p><code>mkdir a;touch b;ln -s $pwd/b a;cp -r a c</code> заменяет символическую ссылку на целевой файл в os x, <code>mkdir a;mkfifo a/b;cp -r a c</code> блокируется чтением fifo и <code>mkdir a;ln -s /dev/zero a;cp -r a b</code> начинает заполнять <code>b/zero</code> с нулями.</p><p>со страницы руководства <code>cp</code> в os x и старых версиях freebsd:</p><pre><code>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. </code></pre><p>в новых версиях freebsd <code>-r</code> эквивалентно <code>-rl</code>:</p><pre><code>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. </code></pre><p> <a href="http://www.gnu.org/software/coreutils/manual/html\_node/cp-invocation.html">http://www.gnu.org/software/coreutils/manual/html\_node/cp-invocation.html</a> :</p><blockquote> <p><code>--copy-contents</code></p> <p>при копировании рекурсивно копируйте содержимое любых специальных файлов (например, файлов fifo и файлов устройств), как если бы они были обычными файлами. это означает, что вы пытаетесь прочитать данные в каждом исходном файле и записать их в место назначения. обычно использование этой опции является ошибкой, так как обычно она оказывает нежелательное влияние на специальные файлы, такие как fifo и те, которые обычно находятся в <code>/dev</code> каталог. в большинстве случаев, <code>cp -r --copy-contents</code> будет зависать бесконечно, пытаясь читать из fifo и специальных файлов, таких как <code>/dev/console</code>, и он заполнит ваш целевой диск, если вы используете его для копирования <code>/dev/zero</code>. эта опция не имеет никакого эффекта, кроме как при рекурсивном копировании, и не влияет на копирование символических ссылок.</p> </blockquote>