Was ist die Zahl zwischen Dateiberechtigung und Eigentümer in der Ausgabe des Befehls ls -l?

Was ist die Zahl zwischen Dateiberechtigung und Eigentümer in der Ausgabe des Befehls ls -l?

Die Ausgabe des ls -lBefehls ergibt folgendes Ergebnis:

Bildbeschreibung hier eingeben

Was ist das Nummernfeld zwischen Dateiberechtigung und Eigentümer? Das heißt, was sind das1, 1, 1 und 2? Ich habe das überprüft, --helpaber das erklärt es nicht.

[EDIT] Ich dachte, es läge an der Anzahl der Dateien in einem Verzeichnis, aber das ist nicht der Fall. Siehe Bild. „tempFolder“ hat 3 Dateien, zeigt aber trotzdem eine „2“ an.

Antwort1

Hinweis: bearbeitet nach @StephaneChazelas Kommentar

Die erste Nummer der ls -lAusgabe nach dem Berechtigungsblock istdie Anzahl der Hardlinks.

Es handelt sich um den gleichen Wert, der vom statBefehl in „Links“ zurückgegeben wird.

Diese Zahl ist die Anzahl der Hardlinks der Datei, wenn auf eine Datei verwiesen wird, bzw. die Anzahl der enthaltenen Verzeichniseinträge, wenn auf ein Verzeichnis verwiesen wird.

ADateihat normalerweise eine Hardlink-Anzahl von 1, aber dies ändert sich, wenn Hardlinks mit dem lnBefehl erstellt werden. Siehedas Debian-Referenzhandbuch.

In Ihrem Beispiel erhöht das Hinzufügen eines Hardlinks für tempFile2 die Anzahl der Links:

ln -l
ln tempFile2 tempHardLink
ln -l

BeidetempFile2UndtempHardLinkhat eine Linkanzahl von 2.

Wenn Sie die gleiche Übung mit einem symbolischen Link ( ln -s tempFile2 tempSymLink) durchführen, erhöht sich der Zählwert nicht.

AVerzeichnishat eine Mindestanzahl von 2 für '.'(Link auf sich selbst) und für den Eintrag im Verzeichnis des übergeordneten Elements.

Wenn Sie in Ihrem Beispiel die Anzahl der Links erhöhen möchten vontempOrdner, erstellen Sie ein neues Verzeichnis und die Nummer wird erhöht.

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

Der Link vonein anderer Ordner/ZutempOrdner/(das ist ..) wird zur Anzahl hinzugefügt.

Antwort2

Unter Unix ist eine Datei normalerweise ein Eintrag in einer Dateitabelle. Es gibt verschiedene Arten von Dateien: normale Dateien, Geräte, symbolische Links, Doors, Pipes, Sockets, Verzeichnisse ...

Die Inode-Nummer (die Sie in der Ausgabe von sehen können ls -i) ist der Index in dieser Tabelle.

Jetzt greifen Sie nicht mehr auf Dateien zu, indem SieInodesondern durchWeg. AWegist eine Kette vonVerzeichnisEinträge. Sie werden feststellen, dass wir nicht vonOrdneraber vonVerzeichnishier. Weil es das ist, was ein Verzeichnis ist (denken Sie an ein Telefonbuch).

Ein Verzeichnis ist eine spezielle Art von Datei, die einer Reihe von Inodes Namen gibt. Ein Verzeichniseintrag ist eine Zuordnung von einem Namen zu einem Inode.

Eine bestimmte Datei (ein Inode) kann mehr als einen Namen in einem Verzeichnis haben (genauso wie es mehr als einen Namen bei einer Telefonnummer geben kann) und kann auch Namen (Einträge) in mehr als einem Verzeichnis haben. Diese nennt manLinks, auch bekannt alsHardlinksunterscheiden vonSoftlinks(ein umgangssprachlicher Ausdruck fürsymbolischer Link,Dabei handelt es sich um einen speziellen Dateityp, der auf einen Pfad zeigt).

Eine Datei (Inode) verfolgt die Anzahl ihrer Links (von Einträgen in einem beliebigen Verzeichnis), sodass die Zuordnung der Datei freigegeben wird, wenn die Zahl 0 erreicht (wenn die Verknüpfung mit dem letzten Verzeichnis aufgehoben wird, in dem auf sie verwiesen wurde).

Dies ist die Zahl (die Anzahl der Links), die in der ls -lAusgabe angezeigt wird.

Wenn eine Nicht-Verzeichnisdatei zum ersten Mal erstellt wird (mit den Systemaufrufen openoder creat(oder bindoder mknodfür einige Dateitypen)), geschieht dies durch die Angabe eines Pfads zur neuen Datei (wie "/a/b"). Was dann passiert, ist, dass eine neue Datei und ein neuer Inode zugewiesen werden und ein neuer Eintrag dem Verzeichnis hinzugefügt wird, das dem "a"Namen im "/"Stammverzeichnis zugeordnet ist. Das ist die anfänglicheVerknüpfungDie Linkanzahl beträgt also eins.

link()Mit dem Systemaufruf (dem Befehl) können später weitere Links hinzugefügt werden . Und mit dem Systemaufruf (dem Befehl) lnkönnen Links entfernt werden .unlink()rm

Sie werden feststellen, dass die Dateien vom TypVerzeichnishaben im Allgemeinen eine Anzahl von Links größer oder gleich 2.

Wenn Sie jetzt ein Verzeichnis erstellen, rufen Sie den mkdir()Systemaufruf auf. So etwas wie mkdir("/a/b"). Es wird dann eine neue Datei vom Typ „Verzeichnis“ zugewiesen. In diesem neuen Verzeichnis werden automatisch zwei Einträge erstellt:

  • "."(PunktfürVerzeichnis). Das ist ein Link zu sich selbst. Die Linkanzahl beträgt also jetzt 1.
  • ".."(fürVerzeichnis'SVerzeichnis). Das ist ein Link zu "/a". Die Linkanzahl von "/a"wird also um eins erhöht.

Anschließend wird auf dieses neue Verzeichnis verwiesen (ein Eintrag wird dafür "/a"hinzugefügt ), sodass die Anzahl der Links nun 2 beträgt. Wenn aufgrund des Eintrags in ein neues Verzeichnis erstellt wird, beträgt die Anzahl der Links 3."/a""/a/b/c""..""/a/b/c""/a/b"

Die meisten Unix-Systeme schränken das Erstellen weiterer Links zu einem Verzeichnis ein, da diese problematische Schleifen verursachen können. Wenn sie einen Link zu einem Verzeichnis zulassen link(), kann dies im Allgemeinen nur der Superuser tun.

Einige Dateisysteme weichen btrfsvon dieser traditionellen Verzeichnisstruktur ab. Sie werden feststellen, dass die Linkanzahl für Verzeichnisse in btrfsDateisystemen immer eins beträgt, auch wenn diese Verzeichnisse einen "."Eintrag mit derselben Inode-Nummer wie sie selbst enthalten.

Die Tatsache, dass die Linkanzahl traditionell 2 plus die Anzahl der Unterverzeichnisse beträgt, hat ihren Nutzen. Zum Beispiel in:

find . -name '*.c' -print

wenn .es keine Unterverzeichnisse, aber Millionen von Dateien enthält. Indem Sie die Anzahl der Links von prüfen ., findkönnen Sie feststellen, dass kein Unterverzeichnis vorhanden ist. Sie findmüssen also nur den Inhalt des Verzeichnisses lesen und die Einträge melden, die auf enden .c(wie bei einer grep '\.c$'Datei mit ein paar Megabyte, keine große Sache). Andernfalls findmüsste Sie den Typ jeder einzelnen Datei prüfen, um festzustellen, ob dort Verzeichnisse vorhanden sind, in die Sie wechseln können (was zu ebenso vielen lstat()Systemaufrufen führen würde). Natürlich funktioniert diese Art der Optimierung nicht auf btrfs(obwohl in modernen Linux-Versionen der Dateityp auch im Verzeichniseintrag für einige Dateisysteme (einschließlich ) gespeichert btrfsund vom getdents(2)Systemaufruf zurückgegeben wird, der zum Abrufen der Liste der Einträge in einem Verzeichnis verwendet wird, lstatist also immer noch nicht erforderlich).

verwandte Informationen