web-dev-qa-db-fra.com

Pourquoi ne puis-je pas enlever le '. annuaire?

J'ai essayé de supprimer le "." annuaire. Je pensais que je pouvais simplement supprimer mon répertoire de travail sans avoir à entrer dans un répertoire parent.

Le point de ma question est de rechercher un aperçu de la manière dont le système Linux fonctionne pour supprimer des fichiers.

41
Goldname

L'élimination du répertoire actuel n'affecte pas l'intégrité du système de fichiers ou son organisation logique. Empêcher la suppression . est effectuée pour suivre la norme POSIX qui étage dans le rmdir(2) Page manuelle:

Si l'argument du chemin fait référence à un chemin dont le composant final est soit DOT OU DOT-DOT, RMDIR () doit échouer.

Une justification peut être trouvée dans le rm page manuelle:

L'utilitaire RM est interdit de supprimer les noms DOT et DOT-DOT afin d'éviter les conséquences de faire quelque chose comme:

rm -r. *

D'autre part, retirez explicitement le répertoire actuel (c'est-à-dire en indiquant son chemin complet ou relativement), une opération autorisée sous UNIX, au moins depuis SVR3, comme il était interdit de la version 7 UNIX jusqu'à SVR2. Ceci est très similaire à ce qui se passe lorsque vous supprimez un fichier qui est lu activement ou écrit. Processus Accès au fichier de suppression Continuez leurs opérations de lecture et d'écriture comme si rien ne s'est passé. Une fois que vous avez supprimé un répertoire actuel de processus, ce répertoire n'est plus accessible bien que son chemin, mais son séjour d'inode présent sur le système de fichiers jusqu'à ce que le processus meurt ou modifie son propre répertoire.

Notez que le processus ne sera pas en mesure d'utiliser un chemin d'accès par rapport à son répertoire actuel pour modifier sa CWD (par exemple, cd ..) car il n'y a plus d'entrée .. dans son répertoire actuel .

Lorsque quelqu'un tape rmdir ., ils s'attendent probablement à ce que la saisie actuelle du répertoire soit supprimée, mais lorsqu'un répertoire est supprimé (à l'aide de son chemin), trois entrées de répertoire sont en réalité supprimées, ., .., et le répertoire lui-même.

Supprimer uniquement . et non à la saisie de cet annuaire de cet annuaire créerait un répertoire non conforme mais comme déjà indiqué, il est interdit par la norme.

Comme @MANMANUEL a fait remarquer à juste titre, il y a une deuxième raison pour laquelle la suppression de . n'est pas autorisée. Il existe au moins un système d'exploitation compatible POSIX (Mac OS X avec HFS +) qui, avec des restrictions fortes, prend en charge la création de lignes hardlinks vers des répertoires existants. Dans ce cas, il n'y a pas de moyen claire de l'intérieur du répertoire pour savoir quelle dureLink est celui qui devrait être supprimé.

90
jlliagre

C'est fait comme ça pour l'intégrité depuis que vous êtes actuellement à l'intérieur de ce répertoire et le . n'est qu'une référence auto-auto.

Vous devez soit aller dans son parent ou appeler rmdir avec son chemin, qui peut être fait avec:

rmdir `pwd`

Si vous en avez souvent besoin, vous pouvez y fixer un alias comme suit:

alias rmc='rmdir `pwd`'

.. qui pourrait être appelé comme rmc seul pour supprimer le répertoire actuel.

9
Julie Pelletier