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.

59voto

Giacomo1968 Points 48326

Selon le mode de fonctionnement des systèmes de fichiers, un répertoire n'est pas un dossier contenant des fichiers, mais plutôt un ensemble de fichiers. qui contient des pointeurs d'inodes aux fichiers "enfants" qui lui sont connectés. En d'autres termes, du point de vue du système de fichiers, un fichier est un fichier, mais un répertoire n'est qu'un fichier contenant une liste de fichiers connectés.

Donc, du point de vue de la ligne de commande, en faisant ceci :

$ cp dir1 copyDir1

Il s'agirait en fait de copier le fichier nommé, dir1 dans un nouveau fichier nommé copyDir1 . Et en ce qui concerne le système de fichiers, dir1 n'est de toute façon qu'un fichier ; le fait qu'il s'agisse d'un "répertoire" ne sera apparent que lorsque le système de fichiers vérifiera effectivement dir1 pour voir ce qu'est réellement ce tas de morceaux.

En -r indique au système de fichiers de parcourir récursivement l'arborescence des fichiers/répertoires et de copier tout le contenu qui pourrait être un "enfant" de ce fichier à un nouvel endroit.

Quant à savoir pourquoi cela peut sembler superflu ou redondant, il s'agit en fait de méthodes historiques de traitement des systèmes de fichiers. Il s'agit également de créer un système qui soit à l'abri de tous les types d'erreurs liées à l'utilisateur, qu'elles soient accidentelles ou intentionnelles.

En d'autres termes, disons que vous avez une ~/bin dans votre répertoire personnel que vous souhaitez copier, mais que vous avez accidentellement omis le champ ~ -Parce que vous êtes un être humain et que vous faites des erreurs, alors c'est juste /bin comme ceci :

cp /bin/ ~/copy_of_bin

Avec le "filet de sécurité" de /bin étant un répertoire, combiné à la nécessité d'un -r vous éviterez de copier accidentellement la racine binaire complète du système sur lequel vous vous trouvez dans votre répertoire personnel. Si ce filet de sécurité n'existait pas, un désastre mineur, voire majeur, se produirait.

La logique est la suivante : à l'époque pré-GUI (interfaces utilisateur graphiques), des conventions logiques/comportementales doivent être établies afin d'éviter que les utilisateurs ne créent des incidents qui peuvent potentiellement tuer un système. Et en utilisant l -r est désormais l'un d'entre eux.

Si cela semble superflu, il suffit de regarder le système d'interface graphique moderne que l'on peut placer au-dessus des systèmes de fichiers Linux. Une interface graphique répond aux problèmes de base de l'utilisateur en lui permettant de glisser-déposer des fichiers et des répertoires en toute simplicité.

Mais dans le cas du domaine des interfaces textuelles, une grande partie de l'"expérience utilisateur" dans ce monde n'est en fait que des obstacles logiques et hérétiques qui aident l'utilisateur à garder le contrôle afin d'éviter un désastre potentiel.

De même, c'est la raison pour laquelle les systèmes de fichiers Linux/Unix n'ont pas de 777 les autorisations et sudo droits définis par défaut et comment les administrateurs de systèmes réels font la grimace lorsqu'un utilisateur définit des droits d'accès à l'information. 777 ou accorde à chacun sudo droits. Il s'agit là de mesures de base visant à garantir la stabilité du système et à le rendre aussi "à l'épreuve des utilisateurs" que possible ; toute personne s'empressant de court-circuiter ces conventions causera très probablement des dommages à son système sans même le savoir.

INFORMATIONS COMPLÉMENTAIRES : Une autre réponse ici sur le site Unix Stack Exchange explique bien pourquoi une copie non récursive d'un répertoire est problématique ; l'accent est mis par moi.

Eh bien, sans le drapeau -R, il est seulement possible de copier f il est plutôt inhabituel que quelqu'un veuille copier de manière non récursive un répertoire : Une copie non récursive aboutirait simplement à un deuxième n le répertoire, pointant directement vers la même structure de répertoire. Parce que c'est rarement ce que les gens veulent, et qu'il existe en fait un programme séparé qui fait cela (ln), une copie non récursive de n'est pas autorisée.

Ainsi, si un répertoire n'est en fait qu'un fichier contenant des éléments d'inode, la réalisation d'une copie directe de ce fichier serait l'équivalent du fonctionnement d'un lien en dur. Ce qui n'est pas ce que l'on souhaite.

19voto

Joe B Points 108

Il est tout à fait vrai que c'est le comportement que nous souhaitons presque tout le temps. Cependant, cela ne signifie pas nécessairement que la copie récursive doit être le comportement par défaut.

Je pense que les raisons cp agit comme il le fait a des racines dans Philosophie Unix . Unix favorise les programmes qui faire une chose et la faire bien ainsi que les programmes qui sont simple dans son interface et sa mise en œuvre (parfois appelé le pire est le meilleur ).

La pièce maîtresse du puzzle est la prise de conscience du fait que cp ne copie pas les répertoires - cp copie des fichiers (et seulement ). Si vous souhaitez copier un répertoire, cp s'appelle lui-même récursivement afin de copier les fichiers de chaque répertoire.

Bien sûr, la différence entre "copier des répertoires" et "copier des fichiers de manière récursive" n'est absolument pas significative du point de vue de l'utilisateur. L'existence de cette interface permet de simplifier la mise en œuvre .

Si vous avez fait cp de copier des répertoires, vous serez rapidement tenté d'ajouter des fonctionnalités qui n'ont de sens que pour les répertoires - par exemple, vous pourriez vouloir copier uniquement les noms de fichiers qui se terminent par .sh . Inévitablement, cela conduit à la gonflement y la dérive des caractéristiques que nous connaissons dans d'autres systèmes d'exploitation, ce qui rend les logiciels lents, complexes et sujets aux erreurs.

Un autre avantage est que le fait d'avoir -r aide également l'utilisateur à comprendre ce qui se passe réellement sous l'interface. Un effet secondaire intéressant est que l'apprentissage du concept d'opération récursive vous épargnera du travail lorsque vous découvrirez d'autres outils qui le prennent en charge (tels que grep par exemple)


Certains vous diront certainement qu'exposer les détails de la mise en œuvre à l'utilisateur est mauvais et que le fait de disposer d'un plus grand nombre de fonctionnalités est bon . Mon intention ici est simplement d'expliquer la logique de ce comportement, et je n'essaierai donc pas d'argumenter dans un sens ou dans l'autre.

5voto

mbb Points 2416

Les interactions avec les répertoires vous permettent de savoir que vous interagissez avec un répertoire et NON avec un simple fichier.

Par exemple :

$ tree
.
 folder1
     sub1
         subsub1

3 directories, 0 files
$
$ cp folder1/ folder2
cp: folder1/ is a directory (not copied).
$
$ mkdir blah
$ cp blah/ blah2
cp: blah/ is a directory (not copied).
$ rm blah/
rm: blah/: is a directory

Ainsi, si vous souhaitez copier avec succès un dossier, puisque cela implique à la fois le dossier et les objets liés au référencement du dossier, vous devez le traiter comme s'il s'agissait d'une collection de fichiers :

$ cp -r folder1/ folder2
$ rm -rf folder1

3voto

UltimateBrent Points 6167

Il s'agit peut-être d'une interface utilisateur sous-optimale aujourd'hui, mais c'est une décision qui a été prise vers 1970, lors de la conception d'UNIX, à une époque où les disques étaient beaucoup plus chers. Des millions de Shell Shell dépendent de ce fonctionnement, et il est bien trop tard pour le changer.

Voir cet article pour les informations sur la conception originale.

3voto

K.M Points 56

L'avantage évident de la -r est que vous pouvez cp * /target/dir pour copier uniquement tous les dossiers du répertoire source dans le répertoire cible, en omettant (bien qu'avec un avertissement) tous les répertoires qu'il contient. cp -r * /target/dir copierait tout à la place, y compris les sous-répertoires.

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