48 votes

Pourquoi la récursivité -r est-elle nécessaire lors de la copie d'un répertoire sous Linux ?

Ma question est la suivante : pourquoi est-il nécessaire d'utiliser la fonction -r (récursif) lors de la copie d'un répertoire ? Par exemple, pourquoi faire cela ?

$ cp -r dir1 copyDir1

Quand ne voudrais-je pas que ce comportement se produise lors de la copie d'un répertoire ?

Une copie récursive d'un répertoire n'est-elle pas le comportement "par défaut", celui que nous voulons presque toujours ?

J'ai l'impression qu'il s'agit d'un drapeau superflu.

3voto

kael Points 51

La conséquence d'une modification de la valeur par défaut serait que des milliers de Shell Shell seraient interrompus. D'où les exigences POSIX et SUS pour le comportement par défaut bien connu.

La raison en est le développement historique des commandes cp, ln et mv (toutes les mêmes commandes binaires sur la plupart des anciens systèmes UNIX) dans les différentes branches d'UNIX. Lorsque -r est apparu (début cp n'avait pas d'option pour copier les répertoires ; Voici une des premières pages de manuel de cp sans -r o -R ), il y avait plusieurs différences dans la gestion des fichiers spéciaux, des liens symboliques et d'autres caprices du système de fichiers.

De The Open Group Base Specifications Issue 7 :

Les versions antérieures de cette norme prenaient en charge l'option -r pour copier les hiérarchies de fichiers. L'option -r est une pratique historique sous BSD et les systèmes dérivés de BSD. Cette option n'est plus spécifiée par POSIX.1-2008 mais peut être présente dans certaines implémentations. L'option -R a été ajoutée en tant que proche synonyme de l'option -r, sélectionnée pour les systèmes cohérence avec toutes les autres options de ce volume de POSIX.1-2008 qui qui effectuent une descente récursive des répertoires.

La différence entre -R et l'option -r supprimée se trouve dans l'option traitement par cp des types de fichiers autres que les fichiers ordinaires et les répertoires. L'option -r a été défini par l'implémentation comment l'option - traitait les fichiers spéciaux afin de permettre de permettre aux implémentations historiques et à celles qui ont choisi de supporter l'option -r avec les mêmes capacités que l'option -R définie dans ce volume de POSIX.1-2008. L'option -r originale, pour des raisons historiques, ne gérait pas les fichiers spéciaux fichiers spéciaux différemment des fichiers normaux, mais lisait toujours le fichier et copiait son contenu. copier son contenu. Cela posait des problèmes évidents en présence de fichiers types de fichiers spéciaux, par exemple, les périphériques de caractères, les FIFO et les sockets. sockets.

En fait, vous verrez encore des personnes qui utilisent régulièrement ce système :

cd dir1 ; tar -cf - . | (cd dir2 ; tar -xpf -)

Parce qu'ils ne croient pas que la cp -r de l'implémentation est celle à laquelle ils sont habitués sur une machine arbitraire ; ou parce qu'ils veulent que l'implémentation soit la même que celle à laquelle ils sont habitués sur une machine arbitraire. tar comportement.

2voto

Leo Chapiro Points 15089

Vous n'avez besoin de cette option que lorsque le cp est une commande permettant de copier fichiers et répertoires et pas seulement les répertoires.

S'il existait une commande spéciale pour la copie de répertoires, le comportement "par défaut" serait sûrement une copie récursive.

1voto

basic6 Points 2392

Comme d'autres l'ont mentionné, un répertoire est en fait un autre type de fichier (par opposition à un fichier normal), qui "contient" (pointe vers) d'autres fichiers. Il peut contenir des sous-répertoires, pour lesquels la même chose s'applique...

Ainsi, si vous copiez un répertoire (du point de vue de l'utilisateur), vous copiez en réalité un tas de fichiers (du point de vue du système de fichiers) (fichiers normaux, fichiers de répertoire, liens symboliques, ...) et pour chaque fichier de répertoire, vous répétez ce processus de manière récursive. Comme la copie d'un répertoire est par définition un processus récursif, l'argument de cp est appelé --recursive .

Il est bien sûr très facile de créer un raccourci de commande dans votre environnement utilisateur (mettez-le dans votre fichier .profile/.bashrc pour qu'il soit disponible en permanence) :

alias cpr='cp -r'

Ou peut-être mieux :

alias cpa='cp -av'

Ainsi, vous pouvez copier un répertoire en utilisant cpa dir1 copyDir1 et il n'imprimera pas seulement ce qui est copié, mais appliquera également les autorisations de fichiers.

Et puisque quelqu'un a mentionné que cp pourrait théoriquement détecter que le fichier source est un répertoire et demander s'il doit le copier récursivement, voici une suggestion rapide :

cp()
{
    if [ ! -e "$1" ]; then
        echo missing source file
        return 1
    fi
    arg="-d --preserve=all -v"
    if [ -d "$1" ]; then
        read -p "Copy directory recursively? " -n 1 -r
        if [ "$REPLY" == "y" ]; then
            arg="$arg -r"
        fi
        echo
    fi
    /usr/bin/cp $arg "$@"
}

Ce n'est qu'un emballage bon marché. Il préserve toujours toutes les méta-données (c'est-à-dire qu'il copie l'heure de modification du fichier, copie correctement les liens symboliques, etc.) et si vous essayez de copier un répertoire, il vous demande s'il doit le copier (de manière récursive).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X