web-dev-qa-db-ja.com

cp -rとcp -R(copyコマンド)の違い

cp -rはファイルを再帰的にコピーするためのものであり、cp -Rディレクトリを再帰的にコピーします。しかし、私は確認しましたが、どちらもファイルとディレクトリの両方をコピーしているように見えますが、同じことです。それで、実際の違いは何ですか?

63
its_me

-Rは明確に定義されたposixであり、-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に遭遇した場合、デバイスまたはFIFOを開いて内容を読み取り、その内容を含む宛先にファイルを作成します。

大文字の-Rは標準化されたオプション(4.4BSDでBSDに導入されましたが、以前のバージョンでは-rの同義語として使用されていました)で、デバイス、FIFO、またはその他の特殊ファイルに遭遇すると、宛先の同等の特殊ファイル。

多くの実装はまだこの区別を維持していますが、一部の(GNU Linuxに典型的なバージョンを含む)は-Rセマンティクスのみを提供し、-rを同義語として提供します。

19
Random832

違いは、1つは小文字の「R」を使用し、もう1つは大文字の「R」を使用することです。それを超えて、違いはありません。 --recursive longオプションを使用した場合も同様です。

OS XおよびFreeBSDの古いバージョンでは、-rはcoreutilsの-R -L --copy-contentsに似ているか、シンボリックリンクをたどって特殊ファイルと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 bb/zeroをゼロで埋め始めます。

OS Xおよび古いバージョンのFreeBSDのcp manページから:

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