Ma question est la suivante: pourquoi est-il nécessaire d'utiliser l' -r
indicateur (récursif) lors de la copie d'un répertoire? Ie, pourquoi faire ceci:
$ cp -r dir1 copyDir1
Quand ne voudrais-je pas ce comportement lors de la copie d'un répertoire?
Une copie récursive d'un répertoire n'est-elle pas vraiment le comportement «par défaut»; le comportement que nous voulons presque tout le temps?
C'est comme si c'était un drapeau superflu.
rm
Réponses:
De la manière dont fonctionnent les systèmes de fichiers, un répertoire n'est pas réellement un dossier contenant des fichiers, mais un répertoire est un fichier contenant des pointeurs inodes vers des fichiers «enfants» qui y sont connectés. Cela signifie que, du point de vue du système de fichiers, un fichier est un fichier, mais un répertoire est simplement un fichier contenant une liste de fichiers connectés.
Donc, du point de vue de la ligne de commande, ceci:
Cela signifierait essentiellement copier le fichier nommé
dir1
dans un nouveau fichier nommécopyDir1
. Et en ce qui concerne le système de fichiers, cedir1
n’est de toute façon qu’un fichier; le fait qu'il s'agisse d'un «répertoire» n'apparaîtra que lorsque le système de fichiers vérifiera réellementdir1
ce qu'est réellement cette pile de bits.L’
-r
indicateur indique au système de fichiers de dérouler de manière récursive l’arborescence de fichiers / répertoires et de copier tout contenu pouvant constituer un «enfant» de ce fichier dans un nouvel emplacement.Maintenant, pour ce qui est de savoir pourquoi cela peut sembler superflu ou redondant, cela revient vraiment aux méthodes historiques de gestion des systèmes de fichiers. En plus de créer un système sûr de tous les types d'erreurs liées à l'utilisateur; accidentelle et intentionnelle.
Cela veut dire, disons que vous avez un
~/bin
fichier dans votre répertoire personnel que vous voulez copier mais que vous avez accidentellement laissé de côté~
- parce que vous êtes un humain et que vous faites des erreurs - et que c'est/bin
comme ça:Avec le «filet de sécurité» d’
/bin
être un répertoire associé à la nécessité du-r
drapeau, vous éviterez de copier accidentellement toute la racine binaire du système que vous utilisez dans votre répertoire personnel. Si ce filet de sécurité n'existait pas, un désastre mineur, voire majeur serait survenu.La logique est que dans les jours qui précèdent les conventions logiques / comportementales pré-GUI (interfaces graphiques) doivent être définies pour éviter que des incidents créés par l'utilisateur puissent potentiellement tuer un système. Et utiliser le
-r
drapeau en fait maintenant partie.Si cela vous semble superflu, ne cherchez pas plus loin que le système graphique moderne que vous pouvez placer au-dessus des systèmes de fichiers Linux. Une interface graphique répond aux problèmes utilisateur de base comme celui-ci en permettant de glisser-déposer facilement des fichiers et des répertoires.
Mais dans le cas des interfaces textuelles, une bonne partie de «l'expérience utilisateur» au sein de ce monde n'est fondamentalement que des obstacles routiers logiques et hueristiques qui permettent de garder l'utilisateur sous 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 ne disposent pas d’
777
autorisations et desudo
droits définis par défaut et de la façon dont les véritables administrateurs système tremblent lorsqu'un utilisateur définit des777
autorisations ou accorde dessudo
droits à tous . Ce sont les tâches de base que l’on fait pour s’assurer que le système est stable et aussi «résistant à l’utilisateur» que possible; quiconque se précipitera pour court-circuiter ces conventions causera très probablement des dommages à son système sans même le savoir.INFORMATIONS SUPPLÉMENTAIRES: Une autre réponse ici sur le site Unix Stack Exchange explique bien pourquoi une copie non récursive d'un répertoire pose problème; l'emphase est à moi.
Ainsi, si un répertoire est simplement un fichier contenant des éléments inode, créer une copie directe de ce fichier équivaudrait à la manière dont un lien réel fonctionnerait. Ce qui n'est pas ce que tout le monde veut.
la source
cp -r /bin
quecp-r ~/bin
. Le drapeau lui-même n’empêche pas les erreurs et ne rend nécessairement personne plus prudent en matière de prudence. Si vous souhaitez éviter les erreurs, la commande cp peut tout aussi bien examiner le nœud en question et fournir une invite, quelque chose dans le sens de "Ceci est un répertoire, voulez-vous copier tout le contenu à l'emplacement spécifié (y / n)? " Ce serait un filet de sécurité . Le fait d’avoir besoin de -r pour les répertoires réduit le plus possible le fardeau de code.C'est très vrai que c'est le comportement que nous voulons presque tout le temps. Cela ne signifie toutefois pas nécessairement que la copie récursive devrait être le comportement par défaut.
Je pense que les raisons sont les
cp
mêmes qu’elles sont enracinées dans la philosophie Unix . Unix privilégie les programmes qui font une chose et qui le font bien , ainsi que les programmes simples à la fois en interface et en implémentation (parfois appelé pire c'est mieux ).La pièce clé du puzzle ici est de réaliser que
cp
ne copiez pas de répertoires - copiez descp
fichiers (et uniquement des fichiers). Si vous souhaitez copier un répertoire,cp
appelez-le 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 rien, du point de vue de l’utilisateur, mais le fait de disposer de cette interface aide l’implémentation à rester simple .
Si vous
cp
parveniez à copier des répertoires, vous seriez bientôt tenté d’ajouter d’autres fonctionnalités qui n’auraient de sens que pour les répertoires. Par exemple, vous souhaiterez peut-être ne copier que les noms de fichiers terminés.sh
. Inévitablement, cela engendre le flou et le glissement de fonctionnalités auxquels nous sommes habitués dans d’autres systèmes d’exploitation - rendant les logiciels lents, complexes et sujets aux erreurs.Avoir un autre avantage est que le fait d’
-r
aider l’utilisateur à comprendre ce qui se passe réellement sous l’interface. Un effet secondaire intéressant de cette méthode est que l’apprentissage du concept d’opération récursive vous évitera du travail lorsque vous en apprendrez sur d’autres outils qui le prennent en charge (commegrep
, par exemple).Certaines personnes vous diront certainement qu'il est mauvais d' exposer les détails de la mise en œuvre à l'utilisateur et qu'il est bon d' avoir plus de fonctionnalités . Mon intention ici est simplement d’expliquer la raison de ce comportement, je ne vais donc pas essayer de discuter d’une façon ou d’une autre.
la source
Les interactions avec les répertoires vous permettent de savoir que vous interagissez avec un répertoire et non pas avec un seul fichier.
Par exemple:
Donc, si vous voulez réussir à copier un dossier, puisqu'il 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:
la source
La conséquence de la modification de la valeur par défaut serait que des milliers de scripts shell se briseraient. Cela conduit aux 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 (le même binaire sur la plupart des anciens systèmes UNIX) dans diverses branches UNIX. Lorsqu’elle
-r
est apparue (à l’époque, ellecp
n’avait pas la possibilité de copier des répertoires; voici une page de manuel de cp sans-r
ou-R
), il existait diverses différences dans la gestion des fichiers spéciaux, des liens symboliques et autres aléas du système de fichiers.D'après les spécifications de base du groupe ouvert, numéro 7 :
En fait, vous verrez toujours des personnes qui utilisent régulièrement:
Parce qu'ils ne croient pas que l'
cp -r
implémentation sera ce à quoi ils sont habitués sur une machine arbitraire; Ou parce qu'ils veulent letar
comportement.la source
Il s’agit peut-être d’une interface sous-optimale aujourd’hui, mais c’est une décision qui a été prise vers 1970 lors de la conception d’UNIX, alors que le disque coûtait considérablement plus cher. Des millions de scripts shell en dépendent, et il est bien trop tard pour le changer.
Voir cet article pour les informations de conception d'origine.
la source
Un avantage évident de l'
-r
indicateur est que vous pouvezcp * /target/dir
copier uniquement tous les fichiers 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.la source
Vous avez besoin de cet indicateur uniquement lorsqu'il
cp
s'agit d'une commande de copie de fichiers et de répertoires, et pas uniquement de 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.
la source
mkdir
?Comme d'autres l'ont mentionné, un répertoire est fondamentalement juste un autre type de fichier (par opposition à un fichier normal), qui "contient" généralement (pointe vers) d'autres fichiers. Il pourrait contenir des sous-répertoires, pour lesquels la même chose s'applique ...
Donc, si vous copiez un répertoire (perspective de l'utilisateur), vous copiez en réalité un groupe de fichiers (perspective du système de fichiers) (fichiers normaux, fichiers de répertoires, liens symboliques, ...) et pour chaque fichier de répertoire, vous répétez cela de manière récursive. processus. 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 entendu très facile de créer un raccourci de commande dans votre environnement utilisateur (placez-le dans votre fichier .profile / .bashrc pour le rendre disponible en permanence):
Ou peut-être mieux:
De cette façon, vous pouvez copier un répertoire en utilisant
cpa dir1 copyDir1
et il imprimera non seulement ce qui est copié, mais appliquera également des autorisations de fichier.Et comme 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 de manière récursive, voici une suggestion rapide:
Ceci est juste un wrapper cp pas cher. Il conserve toujours toutes les métadonnées (c.-à-d. 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).
la source