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 rmdir
pour les opérations d'annuaire?
rmdir
supprime les répertoires,rm
supprime. Pourquoi serait-il intuitifrmdir
de supprimer des non-répertoires?Réponses:
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 pouvaitunlink(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)
etrmdir(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 entrerm(1)
etrmdir(1)
demeure.Personnellement, je trouve cela un peu plus satisfaisant
rmdir junk
et je sais que le pire que j'ai fait a été de supprimer un répertoire vide.la source
rmdir
, elle aurait toujours besoin d'un-r
indicateur. (rmdir -r junk
au lieu derm -r junk
, etrmdir junk
ne fonctionne toujours que si le répertoire est vide)C'est historique.
rm
a été faite pour supprimer les références aux fichiers, armdir
été faite pour supprimer les répertoires, parallèlement àmkdir
. Il y a de nombreuses années, Unixrm
ne pouvait supprimer des répertoires qu'en appelantrmdir
. Il n'y avait pas non plus d'rmdir(2)
appel système,rmdir
c'était un programme qui appelaitunlink(2)
.Les références:
la source
Purement une question d'opinion, mais
rm
supprime les fichiers tout enrmdir
supprimant les répertoires. Un répertoire est un fichier, mais un type spécial de fichier, il est donc logiquerm
de 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 pourrmdir
supprimer quelque chose qui n'est pas un répertoire.la source
rm
supprimer un répertoire vide (sauf en mode récursif)?-r
indicateur pour activer la fonction de fichier spécial de répertoire.