web-dev-qa-db-fra.com

Différence entre cp -r et cp -R (commande de copie)

cp -r est destiné à copier les fichiers de manière récursive, et cp -R pour copier les répertoires récursivement. Mais j'ai vérifié, et les deux semblent copier les fichiers et les répertoires, la même chose. Alors, quelle est la différence en fait?

63
its_me

Tandis que -R est posix bien défini, -r n'est pas portable!

Sous Linux, dans les implémentations GNU et BusyBox de cp, -r et -R sont équivalents.

De l'autre côté, comme vous pouvez le lire dans la page de manuel POSIX de cp, -r le comportement est défini par l'implémentation .

    * 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 En minuscule était une option plus ancienne, introduite dans 4.1BSD, qui copiait simplement tous les non-répertoires sous forme de fichiers. Autrement dit, s'il rencontrait un périphérique ou une FIFO, il l'ouvrirait, lirait le contenu et créerait un fichier à destination avec le contenu.

-R En majuscules était une option standardisée (introduite dans BSD dans 4.4BSD, bien que les versions antérieures l'avaient comme synonyme de -r) Qui, lors de la rencontre d'un périphérique, d'un FIFO ou d'un autre fichier spécial, créer un fichier spécial équivalent à destination.

De nombreuses implémentations conservent toujours cette distinction, mais certaines (y compris la GNU typique de Linux) ne fournissent que la sémantique -R, Avec -r Comme synonyme.

19
Random832

La différence est que l'un utilise un "R" minuscule et l'autre un "R" majuscule. Au-delà, pas de différence. Même chose si vous utilisez le --recursive option longue.

18

Sous OS X et les anciennes versions de FreeBSD -r est comme -R -L --copy-contents dans coreutils, ou il suit les liens symboliques et lit le contenu des fichiers spéciaux et des FIFO.

mkdir a;touch b;ln -s $PWD/b a;cp -r a c remplace le lien symbolique par le fichier cible sous OS X, mkdir a;mkfifo a/b;cp -r a c se bloque en lisant le FIFO, et mkdir a;ln -s /dev/zero a;cp -r a b commence à se remplir b/zero avec des zéros.

Depuis la page de manuel cp sous OS X et les anciennes versions de 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.

Dans les nouvelles versions de FreeBSD -r est équivalent à -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

En cas de copie récursive, copiez le contenu de tout fichier spécial (par exemple, les FIFO et les fichiers de périphérique) comme s'il s'agissait de fichiers normaux. Cela signifie essayer de lire les données de chaque fichier source et de les écrire dans la destination. C'est généralement une erreur d'utiliser cette option, car elle a normalement des effets indésirables sur des fichiers spéciaux comme les FIFO et ceux que l'on trouve généralement dans le /dev répertoire. Dans la plupart des cas, cp -R --copy-contents se bloque indéfiniment en essayant de lire des FIFO et des fichiers spéciaux comme /dev/console, et il remplira votre disque de destination si vous l'utilisez pour copier /dev/zero. Cette option n'a d'effet que si la copie est récursive et n'affecte pas la copie des liens symboliques.

3
Lri