Sous Linux, lorsque vous créez un dossier, il crée automatiquement deux liens durs vers l'inode correspondant. L'un qui est le dossier que vous avez demandé de créer, l'autre étant le .
dossier spécial ce dossier.
Exemple:
$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x 2 fantattitude staff 68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x 2 fantattitude staff 68 18 oct 16:52 .
124593716 drwxr-xr-x 3 fantattitude staff 102 18 oct 16:52 ..
Comme vous pouvez le voir, les deux folder
et à .
l'intérieur folder
ont le même numéro d'inode (montré avec -i
option).
Est-il possible de supprimer ce .
lien spécial ?
C'est uniquement pour l'expérimentation et la curiosité.
Je suppose que la réponse pourrait également s'appliquer au ..
fichier spécial.
J'ai essayé de regarder l' rm
homme mais je n'ai trouvé aucun moyen de le faire. Lorsque j'essaie de supprimer .
tout ce que j'obtiens, c'est:
rm: "." et ".." ne peuvent pas être supprimés
Je suis vraiment curieux de savoir comment ces choses fonctionnent, alors ne vous abstenez pas d'être très bavard sur le sujet.
EDIT: Peut-être que je n'étais pas clair avec mon message, mais je veux comprendre le mécanisme sous-jacent qui est responsable des .
fichiers et les raisons pour lesquelles ils ne peuvent pas être supprimés.
Je sais que la norme POSIX interdit un dossier avec moins de 2 liens physiques, mais je ne comprends pas vraiment pourquoi. Je veux savoir s'il serait possible de le faire de toute façon.
la source
Réponses:
Il est techniquement possible de supprimer
.
, au moins sur les systèmes de fichiers EXT4. Si vous créez une image de système de fichiers danstest.img
, montez-la et créez untest
dossier, puis démontez-la à nouveau, vous pouvez la modifier en utilisantdebugfs
:debugfs
ne se plaint pas et supprime consciencieusement l'.
entrée de répertoire dans le système de fichiers. Letest
répertoire est toujours utilisable, avec une surprise:montre seulement
c'est
.
vraiment parti. Pourtantcd .
,ls .
,pwd
se comportent toujours comme d' habitude!J'avais déjà fait ce test en utilisant
rmdir .
, mais cela supprime l'inode du répertoire ( merci énormément à BowlOfRed pour l' avoir signalé ), ce qui laissetest
une entrée de répertoire pendant et est la vraie raison des problèmes rencontrés. Dans ce scénario, letest
dossier devient alors inutilisable; après avoir monté l'image, l'exécutionls
produitet le journal du noyau montre
L'exécution
e2fsck
dans cette situation sur l'image supprimetest
entièrement le répertoire (l'inode du répertoire a disparu, il n'y a donc rien à restaurer).Tout cela montre qu'il
.
existe en tant qu'entité spécifique dans le système de fichiers EXT4. J'ai eu l'impression du code du système de fichiers dans le noyau qu'il attend.
et..
exister, et avertit s'ils ne le font pas (voirnamei.c
), mais avec leunlink .
test basé sur je n'ai pas vu cet avertissement.e2fsck
n'aime pas l'.
entrée de répertoire manquante et propose de la corriger:Cela recrée l'
.
entrée de répertoire.la source
.
dossier existe donc vraiment à l'intérieur du FS et les outils s'attendent à ce qu'il fonctionne correctement.mount
ouls
). Je n'ai pas vu si d'autres problèmes surgissaient.rmdir .
était en fait en train de détruiretest
et de laisser cela comme une entrée de répertoire pendante, ce qui pourrait entraîner des problèmes. Je vais vérifierunlink
et mettre à jour ma réponse!Il n'y a aucun moyen de supprimer cette entrée de répertoire. L'
.
entrée signifie "ce répertoire", l'..
entrée signifie "le répertoire parent de ce répertoire". Ce ne sont pas vraiment des liens durs, c'est juste la façon dont la structure du répertoire est créée / représentée.la source
ls
automatiquement par ou d'autres outils automatiquement, ce qui ne me semble pas réaliste.Comme décrit dans Lion's Notes sur le code source d'Unix 6Unix début avait un fichier disque où les fichiers et les répertoires étaient représentés sur le disque par des structures inodes. Il y avait un bit spécial qui indiquait que le contenu du fichier était un répertoire. Chaque inode avait un lien vers son inode propriétaire qui permettait à un fichier de savoir dans quel répertoire il se trouvait. L'exception était le répertoire «/» qui lui appartenait. Il y avait également un lien vers le contenu. Si un inode n'avait pas de contenu, il pouvait être renvoyé à la liste gratuite. Puisqu'un répertoire n'était qu'un fichier béni, même un répertoire vide devait avoir du contenu pour l'empêcher d'être récupéré. Ainsi, le .. était le lien de l'inode avec l'inode parent et le. était là pour indiquer que le répertoire était toujours utilisable. rmdir (en appelant unlink) pourrait supprimer le fichier.
la source
Comme le dit le «double possible de» la réponse de la publication , la norme POSIX spécifie que si rmdir tente de supprimer le répertoire en cours, il échouera.
Avec tout ce que vous construisez, vous devez avoir une fondation. Il est difficile de définir des chemins relatifs sans moyen de dire «ici». Alors le '.' est défini comme «ici».
Vous pouvez également supprimer «point» et «point point». Écrivez votre propre système d'exploitation qui ne les définit pas. Bien qu'Unix (et par extension Mac OSX), Linux et même MS DOS et Windows utilisent tous des points et des points.
TL; DR - «point» est dans la définition de l'OS.
la source