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

40

J'ai essayé d'enlever le '.' annuaire. Je pensais pouvoir supprimer mon répertoire de travail sans avoir à entrer dans un répertoire parent.

Le but de ma question est de vous aider à comprendre comment le système linux fonctionne pour supprimer des fichiers.

Goldname
la source
1
Essayez rm -r 'pwd' pour supprimer le
répertoire en
7
Cette question ne double pas celle-là. Celui-ci demande pourquoi le lien dur existe en tant qu'entité physique, plutôt que d'être synthétisé. Cette question demande non seulement pourquoi rm .et rmdir .ne fonctionne pas, mais pourquoi ils sont spécifiés comme ne fonctionnant pas, ce qui est indépendant de l'existence physique d'un lien solide.
JdeBP
9
Image vous avez grimpé dans un arbre pour couper une branche. Sur quel côté de la coupe vous asseyez-vous lorsque vous commencez à voir? (C'est le système de fichiers Linux en quelques mots.)
michael
7
Imaginez rm -rf .*ne faire que trouver ceci, y compris non seulement, .mais aussi .., et ensuite ../.., et ensuite…
janvier

Réponses:

89

La suppression du répertoire en cours n'affecte pas l'intégrité du système de fichiers ni son organisation logique. Pour empêcher la .suppression, il faut suivre la norme POSIX indiquée dans la rmdir(2)page de manuel:

Si l'argument path fait référence à un chemin dont le composant final est un point ou un point, dot, rmdir () doit échouer.

Une raison peut être trouvée dans la rmpage de manuel:

Il est interdit à l'utilitaire rm de supprimer les noms point et point point afin d'éviter les conséquences de faire par inadvertance quelque chose comme:

rm -r. *

D'autre part, supprimer explicitement le répertoire en cours (c'est-à-dire en indiquant son chemin complet ou relatif) est une opération autorisée sous Unix, du moins depuis SVR3 car il était interdit avec Unix version 7 jusqu'à SVR2. Ceci est très similaire à ce qui se produit lorsque vous supprimez un fichier en cours de lecture ou d'écriture. Les processus accédant au fichier de suppression continuent leurs opérations de lecture et d'écriture comme si rien ne s'était passé. Une fois que vous avez supprimé un répertoire de processus en cours, ce répertoire n'est plus accessible par son chemin, mais son inode reste présent sur le système de fichiers jusqu'à la fin du processus ou la modification de son propre répertoire.

Notez que le processus ne pourra pas utiliser un chemin relatif à son répertoire actuel pour changer son cwd (par exemple cd ..) car il n'y a plus d' ..entrée dans son répertoire actuel.

Lorsque le type de quelqu'un rmdir ., ils attendent probablement l'entrée du répertoire en cours à supprimer , mais quand un répertoire est supprimé ( en utilisant son chemin), trois entrées du répertoire sont effectivement supprimés, ., ..et le répertoire lui - même.

Supprimer uniquement .et pas l'entrée de répertoire de ce répertoire créerait un répertoire non conforme, mais comme déjà indiqué, il est interdit par la norme.

Comme @Emmanuel l'a fait remarquer à juste titre, il y a une deuxième raison pour laquelle le retrait .n'est pas autorisé. Il existe au moins un système d'exploitation compatible POSIX (Mac OS X avec HFS +) qui, avec de fortes restrictions, prend en charge la création de liens durables vers des répertoires existants. Dans ce cas, il n’existe aucun moyen clair, à l’intérieur du répertoire, de savoir quel lien physique est celui qui doit être supprimé.

jlliagre
la source
9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "La signification de la suppression du chemin / du point n'est pas claire, car le nom du fichier (répertoire) dans le répertoire parent à supprimer n'est pas clair, en particulier en présence de multiples liens vers un répertoire "
Emmanuel
@Emmanuel Supprimer un répertoire comportant plus de deux liens (c'est-à-dire qu'il n'est pas vide) est déjà interdit de par la conception (répertoire non vide). Un répertoire avec un nombre de liens égal à un est interdit par la norme (au moins avec les systèmes de fichiers où le nombre de liens a une signification).
jlliagre
3
@jlliagre: Il ne s'agit pas d'un répertoire contenant plusieurs liens, mais d'un répertoire comportant plusieurs liens. Certains systèmes de fichiers et / ou systèmes d'exploitation l'interdisent, mais pas tous.
Jörg W Mittag Le
@ JörgWMittag Un répertoire contenant plusieurs répertoires possède par nature plusieurs liens, car tous ses sous ..- répertoires y sont liés . C’est le cas unique de link count > 2la majorité écrasante des systèmes d’exploitation et des systèmes de fichiers. Par conséquent, "certains systèmes de fichiers et / ou systèmes d’exploitation" est un euphémisme. La seule exception connue non historique est Mac OS X avec HFS +, qui ajoute des restrictions sur qui et quoi faire. Accordé le commentaire POSIX est dirigé vers cette bizarrerie. Voir unix.stackexchange.com/questions/22394/…
jlliagre le
Hé, je l’ai déjà fait rm -r .*et tout a été balayé récursivement dans le répertoire parent… C’était il ya plus de dix ou deux ans, mais il est bon de savoir que cela rmn’est plus permis.
Antak
9

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

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

rmdir `pwd`

Si vous en avez souvent besoin, vous pouvez lui attribuer un alias tel que:

alias rmc='rmdir `pwd`'

.. qui pourrait être appelé rmcseul pour supprimer le répertoire actuel.

Julie Pelletier
la source
13
Mais pourquoi / comment l'hypothétique rmdir .intégrité du système de fichiers de compromis de commande d'une manière rmdir $(pwd)ou rmdir "$PWD"ne fonctionne pas?
G-Man dit 'Réintégrez Monica' le
4
Ce n’est pas une question d’intégrité de FS, mais d’organisation logique. Lorsque vous avez choisi votre répertoire actuel, vous indiquez au shell d'utiliser ce répertoire pour vos opérations à venir, mais vous ne pouvez pas supprimer quelque chose de lui-même.
Julie Pelletier
7
Je crains que cela ne paraisse conjectural.
Emmanuel
4
@FranklinPiat Je n'ai pas trouvé votre commentaire particulièrement utile: 1. Où l'OP a-t-il été utilisé rm *et qu'entendez-vous par historique du shell? 2. La réponse a abordé la partie pourquoi , 3. Vous souhaitez élaborer?
JBentley
4
@ G-Man si vous le faites rmdir $(pwd), pwddéfinit un nom logique pour le répertoire en cours, par exemple /foo/bar/baz, puis rmdir, voyant ce chemin, supprime l' bazentrée du /foo/barrépertoire, à condition que les conditions soient remplies. C'est logique. La commande rmdir ., en revanche, est une instruction pour supprimer l’ .entrée du répertoire actuel, ce qui n’est ni autorisé (cela violerait la contrainte que chaque répertoire ait une .entrée pointant sur elle-même) ni utile (elle ne supprimerait pas le lien). tu voulais enlevé).
Hobbs