Quel est le nombre entre l'autorisation de fichier et le propriétaire dans le résultat de la commande ls -l?


35

Le résultat de la ls -lcommande donne le résultat suivant:

entrez la description de l'image ici

Quel est le champ numérique entre l’autorisation de fichier et le propriétaire? c'est-à-dire quels sont ces 1, 1, 1 et 2 ? J'ai vérifié le --helpmais ça ne l'explique pas.

[EDIT] Je pensais que c'était le nombre de fichiers dans un répertoire, mais ce n'est pas le cas. Voir image. "tempFolder" a 3 fichiers mais affiche toujours un "2"

Réponses:


33

Note: édité après le commentaire de @StephaneChazelas

Le premier numéro de la ls -lsortie après le bloc d’autorisations est le nombre de liens physiques .

C'est la même valeur que celle renvoyée par la statcommande dans "Liens".

Ce nombre est le nombre de liens physiques du fichier, lorsqu'il fait référence à un fichier, ou le nombre d'entrées de répertoire contenues, lorsqu'il est fait référence à un répertoire.

Un fichier a généralement un nombre de liens physiques égal à 1, mais cela change si des liens physiques sont créés avec la lncommande. Voir le manuel de référence Debian .

Dans votre exemple, l'ajout d'un lien physique pour tempFile2 augmentera le nombre de liens:

ln -l
ln tempFile2 tempHardLink
ln -l

Les deux tempFile2 et tempHardLink auront un nombre de liens 2.

Si vous faites de même avec un lien symbolique ( ln -s tempFile2 tempSymLink), la valeur du nombre n'augmentera pas.

Un répertoire aura un compte minimum de 2 pour '.'(lien vers lui-même) et pour l'entrée dans le répertoire de son parent.

Dans votre exemple, si vous souhaitez augmenter le nombre de liens de tempFolder , créez un nouveau répertoire et le nombre augmentera.

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

Le lien de anotherFolder / to tempFolder / (qui est ..) sera ajouté au compte.



Comme il est affiché entre les permissions et la propriété, vous avez l’impression que c’est très important, mais je ne l’ai jamais utilisé. Quand est-ce généralement nécessaire?
Emanuel Berg

1
C'est faux. C'est le nombre de liens, période. Pour les répertoires, vous avez 2 pour son entrée dans son répertoire parent (comme pour n'importe quel fichier) et l' .entrée en elle-même, plus un pour les ..entrées dans chacun de ses sous-répertoires.
Stéphane Chazelas

@StephaneChazelas Tous les documents que j'ai trouvés parlent du nombre de liens physiques (par exemple, linuxgazette.net/issue35/tag/links.html ). Aussi, j'ai trouvé qu'une question similaire avait été posée dans AskUbuntu ( askubuntu.com/questions/19510/… ). Je vais vérifier le code source de coreutils et voir si je peux trouver la réponse exacte.
Damien

2
@EmanuelBerg lorsque les systèmes de fichiers étaient beaucoup moins fiables qu'ils ne le sont maintenant et vous travailliez sur le système de fichiers que vous avez développé, et lspourrait passer 2 caractères et vous donner plus d' informations, et il n'y avait pas de stat(1)commandement ni , find(1)ni fsck, ni les liens symboliques qu'il était probablement beaucoup plus utile que c'est aujourd'hui. Il ne peut pas être changé sans casser les scripts shell dont les auteurs sont passés depuis longtemps /dev/null; Il en est ainsi depuis au moins 1979.
msw

8

Sous Unix, généralement, un fichier est une entrée dans une table de fichiers. Il existe différents types de fichiers: fichiers normaux, périphériques, liens symboliques, portes, tuyaux, sockets, répertoires ...

Le numéro d'inode (que vous pouvez voir dans la sortie de ls -i) est l'index de cette table.

Maintenant, vous n’accédez pas aux fichiers par inode mais par chemin . Un chemin est une chaîne d' entrées de répertoire . Vous remarquerez que nous ne parlons pas de dossier mais de répertoire ici. Parce que c'est ce qu'est un répertoire (pensez à un répertoire téléphonique).

Un répertoire est un type spécial de fichier qui donne des noms à un certain nombre d'inodes. Une entrée de répertoire est une correspondance entre un nom et un inode.

Un fichier donné (un inode) peut avoir plus d'un nom dans un répertoire (tout comme il peut y avoir plus d'un nom sur un numéro de téléphone), ainsi que des noms (entrées) dans plusieurs répertoires. Celles-ci sont appelées liens, également appelés liens durs, à distinguer des liens souples (un type spécial de fichier qui est un pointeur sur un chemin).

Un fichier (inode) garde trace du nombre de liens (d'entrées dans n'importe quel répertoire) qu'il possède. Ainsi, lorsque le nombre atteint 0 (lorsqu'il est dissocié du dernier répertoire dans lequel il a été référencé), il est désalloué.

C'est ce nombre (le nombre de liens) qui est affiché dans la ls -lsortie.

Lorsqu'un fichier autre que de répertoire est créé pour la première fois (avec les appels système openor creat(ou or bindou mknodpour certains types de fichiers)), vous devez indiquer un chemin d'accès au nouveau fichier (du type "/a/b"). Il se passe alors un nouveau fichier, un inode est alloué et une nouvelle entrée est ajoutée au répertoire associé au "a"nom figurant dans le "/"répertoire racine. C'est le lien initial donc le nombre de liens est un.

Plus de liens peuvent être ajoutés ultérieurement avec l' link()appel système (la lncommande). Et les liens peuvent être supprimés avec l' unlink()appel système (la rmcommande).

Vous remarquerez que les fichiers de type répertoire ont généralement un nombre de liens supérieur ou égal à 2.

Désormais, lorsque vous créez un répertoire, vous appelez l’ mkdir()appel système. Quelque chose comme mkdir("/a/b"). Ce qu’il fait alors est d’allouer un nouveau fichier de type répertoire. Dans ce nouveau répertoire, il crée automatiquement deux entrées:

  • "."( point pour le répertoire ). Ce qui est un lien vers lui-même. Donc, le nombre de liens est maintenant 1.
  • ".."(pour le répertoire du répertoire ). Quel est un lien vers "/a". Donc, le nombre de liens de "/a"est incrémenté de un

Ensuite, ce nouveau répertoire est lié à "/a"(une entrée est ajoutée "/a"pour celui-ci), donc son nombre de liens est maintenant 2. Si un "/a/b/c"répertoire est créé, en raison de l' ".."entrée "/a/b/c", le nombre de liens de "/a/b"devient 3.

La plupart des Unices limitent la création de liens supplémentaires vers un répertoire car ils peuvent entraîner des boucles problématiques. Quand ils autorisent un link()sur un répertoire, seul le superutilisateur peut le faire.

Certains systèmes de fichiers, par exemple, btrfss’écartent de cette structure de répertoires traditionnelle. Vous remarquerez que le nombre de liens sur les répertoires dans btrfsles systèmes de fichiers est toujours égal à un, même si ces répertoires contiennent une "."entrée avec le même numéro d'inode qu'eux-mêmes.

Le fait que le nombre de liens soit traditionnellement de 2 plus le nombre de sous-répertoires a son utilité. Par exemple, dans:

find . -name '*.c' -print

Si .ne contient pas de sous-répertoires mais contient des millions de fichiers. En vérifiant le nombre de liens de ., findpeut savoir qu'il n'y a pas de sous-répertoire. Il findsuffit donc de lire le contenu du répertoire et de rapporter les entrées qui se terminent .c(comme un grep '\.c$'fichier de quelques mégaoctets, ce n’est pas grave). Sinon, il findfaudrait vérifier le type de chaque fichier pour voir s’il existe des répertoires dans lesquels descendre (ce qui entraîne autant d’ lstat()appels système). Bien sûr, ce type d’optimisation ne fonctionne pas btrfs(bien que dans les versions modernes de Linux, le type de fichiers soit également stocké dans l’entrée du répertoire pour certains systèmes de fichiers (y compris btrfs) et renvoyé par l’ getdents(2)appel système utilisé pour récupérer la liste des entrées. dans un répertoire, donclstat n'est toujours pas nécessaire).


+1, bonne réponse :) En regardant le code source de ls, j'ai remarqué que le numéro de lien avait été mis à jour après un appel à stat. Donc, la commande stat vous donnera la valeur de liens pour un fichier ou un répertoire.
Damien

Qu'est-ce que cela signifie d'avoir à la -place d'un nombre à la place après les autorisations en ls -lsortie?
Shubham
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.