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

61

cp -rest destiné à copier des fichiers de manière récursive et cp -Rà copier des répertoires de manière récursive. 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 réalité?

c'est moi
la source
2
Chaque mention de ces options dans les manuels Linux dit qu'elles sont synonymes. (Ils ne sont pas sur d'autres variantes d'Unix.)
Gilles 'SO- arrête d'être méchant'

Réponses:

75

Bien que -Rposix soit bien défini, ce -rn’est pas portable!

Sous Linux, dans les implémentations GNU et BusyBox de cp, -ret -Rsont équivalentes.

De l'autre côté, comme vous pouvez le lire dans la page de manuel POSIX de cp, le -rcomportement 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.
Andcoz
la source
14
Une des différences serait que, dans OSX par exemple, -rcopiera les fichiers réels pointés par des liens symboliques tout -Ren copiant le lien symbolique qui est ce à quoi il est destiné la plupart du temps.
Nacho4d
18

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

Ignacio Vazquez-Abrams
la source
4
Depuis la page de manuel: -R, -r, --recursive - copie les répertoires de manière récursive
Dave Jennings
6
@DaveJennings: Ce n'est pas parce qu'ils sont équivalents sur une plate-forme qu'ils sont sur tous. Sur certaines mises en œuvre de cpil y a en fait une distinction. Voir la réponse de Random832 . @ Ignacio, vous devriez inclure un qualificatif dans cette réponse qui indique "si vous êtes l' cpimplémentation GNU moderne" ou quelque chose comme ça.
Caleb
@Caleb: la question est étiquetée "linux". Quoi d'autre serait-il?
Ignacio Vazquez-Abrams
4
-R et -r donnent un comportement différent sur certains des systèmes que j'utilise (OS X, FreeBSD, BusyBox coreutils; je ne sais pas avec certitude lesquels pour le moment). J’ai décidé il ya longtemps que c’était prudent de toujours utiliser -Runiquement, et certaines des pages de manuel des systèmes que nous venons de mentionner le recommandent également.
dubiousjim
18

La minuscule -rétait une option plus ancienne, introduite dans 4.1BSD, qui copiait simplement tous les non-répertoires sous forme de fichiers. C'est-à-dire que s'il rencontrait un périphérique ou une FIFO, il l'ouvrirait, en lirait le contenu et créerait un fichier à la destination avec le contenu.

Les majuscules -Rétaient une option standardisée (introduite dans BSD sous 4.4BSD, bien que les versions précédentes le désignent comme synonyme -r) qui, lorsqu’un périphérique, une FIFO ou un autre fichier spécial serait créé, créeraient un fichier spécial équivalent sur la destination.

De nombreuses implémentations maintiennent toujours cette distinction, mais certaines (y compris la version GNU typique de Linux) ne fournissent que la -Rsémantique, avec -run synonyme.

Au hasard832
la source
3

Sous OS X et dans les anciennes versions de FreeBSD, -rvous -R -L --copy-contentsfaites comme dans Coreutils, ou suivez les liens symboliques et lisez le contenu des fichiers spéciaux et des FIFO.

mkdir a;touch b;ln -s $PWD/b a;cp -r a cremplace le lien symbolique par le fichier cible sous OS X, mkdir a;mkfifo a/b;cp -r a cest bloqué lors de la lecture de la FIFO et mkdir a;ln -s /dev/zero a;cp -r a bcommence à se remplir b/zerode zéros.

Depuis la cppage de manuel 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 -rest é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

Si vous copiez de manière récursive, copiez le contenu de tous les fichiers spéciaux (par exemple, des fichiers FIFO et des fichiers de périphérique) comme s'il s'agissait de fichiers normaux. Cela signifie essayer de lire les données dans 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 tels que les FIFO et ceux généralement présents dans le /devrépertoire. Dans la plupart des cas, cp -R --copy-contentsbloquera indéfiniment en essayant de lire à partir de fichiers FIFO et spéciaux /dev/console, et remplira votre disque de destination si vous l'utilisez pour copier /dev/zero. Cette option n'a d'effet que sur la copie récursive et n'affecte pas la copie de liens symboliques.

Lri
la source
-1

Une des différences que j'ai trouvées est que -r ne copie pas les répertoires cachés tandis que -R copie les répertoires cachés.

J'ai testé le répertoire .git dans le répertoire cible et suis parvenu à la conclusion ci-dessus. J'utilise actuellement centOS.

Je peux me tromper mais c'est ouvert à la discussion.

Zeel SHah
la source
4
Je ne vois pas cela sur CentOS 5; -ret les -Rdeux copient des répertoires cachés
Michael Mrozek