La différence entre cp -r et cp -R (commande de copie)
On février 18, 2021 by admin cp -r
est destinée à copier des fichiers de manière récursive, et cp -R
pour copier des répertoires de manière récursive. Mais jai 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?
Commentaires
- Chaque mention de ces options dans les manuels Linux indique quelles ‘ sont des synonymes. (Ils ‘ ne sont pas sur dautres variantes dUnix.)
Réponse
Alors que -R
est posix bien défini, -r
nest pas portable!
Sous Linux, dans les implémentations GNU et BusyBox de cp
, -r
et -R
sont équivalentes.
De lautre côté, comme vous pouvez le lire dans la page de manuel POSIX de cp
, -r
comportement est défini par limplé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.
Commentaires
- Une des différences serait que, dans OSX par exemple,
-r
copiera les fichiers réels pointés par des liens symboliques tandis que-R
copiez le lien symbolique auquel il est destiné la plupart du temps.
Réponse
Minuscules -r
était une option plus ancienne, introduite dans 4.1BSD, qui copiait simplement tous les non-répertoires sous forme de fichiers. Autrement dit, sil rencontrait un périphérique ou un FIFO, il louvrirait, lirait le contenu et créerait un fichier à la destination avec le contenu.
Majuscules -R
était une option standardisée (introduite dans BSD dans BSD 4.4, bien que les versions précédentes laient comme synonyme de -r
) qui, en rencontrant un périphérique, FIFO ou autre fichier spécial, créer un fichier spécial équivalent à la destination.
De nombreuses implémentations maintiennent encore cette distinction, mais certaines (y compris la version GNU typique de Linux) ne fournissent que le -R
sémantique, avec -r
comme synonyme.
Réponse
La différence est que lun utilise un « R » minuscule et lautre un « R » majuscule. Au-delà, aucune différence. Même chose si vous utilisez loption longue --recursive
.
Commentaires
- Depuis la page de manuel: – R, -r, –recursive – copie les répertoires de manière récursive
- @DaveJennings: Ce nest pas parce quils sont équivolents sur une plate-forme que ‘ quils sont sur tous. Sur certaines implémentations de
cp
, il y a en fait une distinction. Voir la réponse de Random832 ‘ . @Ignacio, vous devez inclure un qualificatif dans cette réponse indiquant » si votrecp
est limplémentation GNU moderne » ou quelque chose comme ça. - @Caleb: La question est balisée » linux « . Quest-ce que ce serait dautre?
- -R et -r donnent un comportement différent sur certains des systèmes que jutilise (OS X, FreeBSD, BusyBox coreutils; je ne sais pas lesquels pour le moment). Jai décidé il y a longtemps quil était prudent de toujours utiliser uniquement
-R
, et en fait, certaines des pages de manuel sur les systèmes que nous venons de mentionner le recommandent également.
Réponse
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 dans OS X, mkdir a;mkfifo a/b;cp -r a c
bloque la lecture du FIFO et mkdir a;ln -s /dev/zero a;cp -r a b
commence à 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
équivaut à -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, les FIFO et les fichiers de périphérique) comme sil sagissait de fichiers normaux. Cela signifie essayer de lire les données de chaque fichier source et de les écrire dans la destination. Cest généralement une erreur dutiliser cette option, car elle a normalement des effets indésirables sur des fichiers spéciaux comme les FIFO et ceux généralement trouvés dans le répertoire
/dev
.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 lutilisez pour copier/dev/zero
. Cette option na aucun effet sauf en cas de copie récursive et naffecte pas la copie des liens symboliques.
Répond
une des différences que jai trouvé que -r ne copie les répertoires cachés tandis que -R copie les répertoires cachés.
Jai testé le répertoire .git dans le répertoire cible et suis arrivé à la conclusion ci-dessus. Jutilise actuellement centOS.
Je me trompe peut-être mais cest ouvert à la discussion.
Commentaires
- Je ne ‘ t voir ceci sur CentOS 5;
-r
et-R
copient les deux répertoires cachés
Laisser un commentaire