cp -r
はファイルを再帰的にコピーするためのものであり、cp -R
ディレクトリを再帰的にコピーします。しかし、私は確認しましたが、どちらもファイルとディレクトリの両方をコピーしているように見えますが、同じことです。それで、実際の違いは何ですか?
-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.
小文字-r
は、4.1BSDで導入された古いオプションで、ディレクトリ以外のすべてのファイルを単にファイルとしてコピーしていました。つまり、デバイスまたはFIFOに遭遇した場合、デバイスまたはFIFOを開いて内容を読み取り、その内容を含む宛先にファイルを作成します。
大文字の-R
は標準化されたオプション(4.4BSDでBSDに導入されましたが、以前のバージョンでは-r
の同義語として使用されていました)で、デバイス、FIFO、またはその他の特殊ファイルに遭遇すると、宛先の同等の特殊ファイル。
多くの実装はまだこの区別を維持していますが、一部の(GNU Linuxに典型的なバージョンを含む)は-R
セマンティクスのみを提供し、-r
を同義語として提供します。
違いは、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 b
はb/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
のコピーに使用すると宛先ディスクがいっぱいになります。このオプションは、再帰的にコピーしない限り効果がなく、シンボリックリンクのコピーには影響しません。