
Die Ausgabe des ls -l
Befehls ergibt folgendes Ergebnis:
Was ist das Nummernfeld zwischen Dateiberechtigung und Eigentümer? Das heißt, was sind das1, 1, 1 und 2? Ich habe das überprüft, --help
aber 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 -l
Ausgabe nach dem Berechtigungsblock istdie Anzahl der Hardlinks.
Es handelt sich um den gleichen Wert, der vom stat
Befehl 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 ln
Befehl 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 -l
Ausgabe angezeigt wird.
Wenn eine Nicht-Verzeichnisdatei zum ersten Mal erstellt wird (mit den Systemaufrufen open
oder creat
(oder bind
oder mknod
fü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) ln
kö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 btrfs
von dieser traditionellen Verzeichnisstruktur ab. Sie werden feststellen, dass die Linkanzahl für Verzeichnisse in btrfs
Dateisystemen 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 .
, find
können Sie feststellen, dass kein Unterverzeichnis vorhanden ist. Sie find
mü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 find
mü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 btrfs
und vom getdents(2)
Systemaufruf zurückgegeben wird, der zum Abrufen der Liste der Einträge in einem Verzeichnis verwendet wird, lstat
ist also immer noch nicht erforderlich).