J'ai toujours été curieux de savoir pourquoi la commande pour tout supprimer dans un répertoire est rm -rf
.
Pourquoi n'y a-t-il pas de drapeaux pour faire la même chose avec rmdir
?
Ne serait-il pas plus intuitif d'utiliser rmdir
pour les opérations sur les répertoires ?
Réponse acceptée :
Au début du système de fichiers Unix (au moins à l'époque de la V7 vers 1970), les répertoires étaient implémentés en tant que fichiers spéciaux et seul root pouvait utiliser le mknod(2)
appel système qui les a créés et seul root pouvait unlink(2)
un fichier spécial de répertoire.
Ces protections ont été mises en place afin de maintenir la cohérence de la structure du système de fichiers. Par exemple, si un utilisateur était autorisé à écrire dans un fichier spécial de répertoire, il pourrait rendre son répertoire parent ..
pointe vers lui-même (spécifiquement son propre i-node). Cela créerait une référence circulaire dans le système de fichiers, ce qui serait une mauvaise chose. Bien sûr, il y a d'autres incohérences que l'on pourrait faire, ceci n'est qu'un exemple clair.
La cohérence a été maintenue par des programmes de l'espace utilisateur comme mkdir(1)
et rmdir(1)
qui étaient racine Set-UID 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 de suppression s'exécuterait en tant qu'UID actuel, puis appellerait rmdir(1)
uniquement pour supprimer les répertoires vides. Il s'agit toujours d'une méthode assez standard d'élévation des autorisations :n'utilisez pas plus d'autorisations que nécessaire.
Quelque temps plus tard mkdir(2)
et rmdir(2)
ont été ajoutés en tant que leurs propres appels système mais la relation entre rm(1)
et rmdir(1)
reste.
Personnellement, je trouve un peu plus satisfaisant de rmdir junk
et sachez que le pire que j'ai fait a été de supprimer un répertoire vide.