Pourquoi est-ce rm -rf et non rmdir -rf

13

J'ai toujours été curieux de savoir pourquoi la commande pour supprimer tout dans un répertoire est rm -rf.

Pourquoi n'y a-t-il pas de drapeaux pour faire la même chose rmdir?

Ne serait-il pas plus intuitif à utiliser rmdirpour les opérations d'annuaire?

kouroshk
la source
9
rmdirsupprime les répertoires, rmsupprime. Pourquoi serait-il intuitif rmdirde supprimer des non-répertoires?
Stéphane Chazelas
5
Parce que ce n'est pas le cas. Vous avez une quarantaine d'années de retard à poser cette question, et vous posez les mauvaises personnes.
user207421

Réponses:

25

Au début du système de fichiers Unix (au moins dans les jours V7 vers 1970), les répertoires étaient implémentés en tant que fichiers spéciaux et seul root pouvait utiliser l' mknod(2)appel système qui les avait créés et seul root pouvait unlink(2)un fichier spécial de répertoire.

Ces protections étaient en place afin de maintenir la structure du système de fichiers cohérente. Par exemple, si un utilisateur était autorisé à écrire dans un fichier spécial de répertoire, il pourrait faire ..pointer son répertoire parent vers lui-même (en particulier son propre i-node). Cela créerait une référence circulaire dans le système de fichiers qui serait une mauvaise chose. Bien sûr, il pourrait y avoir d'autres incohérences, ce n'est qu'un exemple clair.

La cohérence a été maintenue par les programmes de l'espace utilisateur comme mkdir(1)et rmdir(1)qui étaient Set-UID root afin qu'ils puissent effectuer les appels système privilégiés au nom d'un utilisateur non privilégié. Lorsque la récursivité a été ajoutée à rm(1), la commande remove s'exécutait en tant qu'UID actuel, puis appelait àrmdir(1) uniquement pour supprimer les répertoires vides. C'est toujours une méthode assez standard d'élévation des autorisations: n'utilisez pas plus d'autorisations que vous n'en avez besoin.

Un peu plus tard mkdir(2)etrmdir(2) ont été ajoutés comme leurs propres appels système, mais la relation entre rm(1)et rmdir(1)demeure.

Personnellement, je trouve cela un peu plus satisfaisant rmdir junket je sais que le pire que j'ai fait a été de supprimer un répertoire vide.

msw
la source
1
Concernant la dernière phrase: Vraisemblablement, si l'opération de suppression récursive était en cours rmdir, elle aurait toujours besoin d'un -rindicateur. ( rmdir -r junkau lieu de rm -r junk, et rmdir junkne fonctionne toujours que si le répertoire est vide)
user253751
7

C'est historique. rma été faite pour supprimer les références aux fichiers, a rmdirété faite pour supprimer les répertoires, parallèlement à mkdir. Il y a de nombreuses années, Unix rmne pouvait supprimer des répertoires qu'en appelant rmdir. Il n'y avait pas non plus d' rmdir(2)appel système, rmdirc'était un programme qui appelait unlink(2).

Les références:

Dee Hendrick
la source
2

Purement une question d'opinion, mais rmsupprime les fichiers tout en rmdirsupprimant les répertoires. Un répertoire est un fichier, mais un type spécial de fichier, il est donc logique rmde les supprimer, mais de les traiter spécialement (c'est-à-dire d'exiger une option supplémentaire pour activer la fonctionnalité). Par contre, tous les fichiers ne sont pas des répertoires, et cela n'a aucun sens à mon humble avis pour rmdirsupprimer quelque chose qui n'est pas un répertoire.

Darwin von Corax
la source
1
Si tel était le cas, pourquoi ne peut-il pas rmsupprimer un répertoire vide (sauf en mode récursif)?
user253751
Même raison qu'il ne peut pas supprimer un répertoire complet - il nécessite l' -rindicateur pour activer la fonction de fichier spécial de répertoire.
Darwin von Corax
1
Raisonnement
Je dirais que mon raisonnement a une excentricité >> 1 ...
Darwin von Corax