Wie lautet die Zahl zwischen Dateiberechtigung und Eigentümer in der Ausgabe des Befehls ls -l?
35
Die Ausgabe des ls -lBefehls ergibt folgendes Ergebnis:
Was ist das Nummernfeld zwischen Dateiberechtigung und Eigentümer? dh was sind diese 1, 1, 1 und 2 ? Ich habe das überprüft, --helpaber das erklärt es nicht.
[EDIT] Ich dachte, es ist die Anzahl der Dateien in einem Verzeichnis, aber es ist nicht. Siehe Bild. "tempFolder" hat 3 Dateien, zeigt aber immer noch eine "2"
Es ist derselbe Wert wie der vom statBefehl in "Links" zurückgegebene.
Diese Nummer ist die Anzahl der Hardlinks der Datei, wenn auf eine Datei verwiesen wird, oder die Anzahl der enthaltenen Verzeichniseinträge, wenn auf ein Verzeichnis verwiesen wird.
Eine Datei hat normalerweise eine Anzahl fester Verknüpfungen von 1, dies ändert sich jedoch, wenn mit dem lnBefehl feste Verknüpfungen hergestellt werden . Siehe das Debian-Referenzhandbuch .
In Ihrem Beispiel erhöht das Hinzufügen eines festen Links für tempFile2 die Anzahl der Links:
ln -l
ln tempFile2 tempHardLink
ln -l
Sowohl tempFile2 als auch tempHardLink haben eine Linkanzahl von 2.
Wenn Sie dasselbe mit einem symbolischen Link ( ln -s tempFile2 tempSymLink) üben , wird der Zählwert nicht erhöht.
Ein Verzeichnis hat eine Mindestanzahl von 2 für '.'(Link zu sich selbst) und für den Eintrag im übergeordneten Verzeichnis.
Wenn Sie in Ihrem Beispiel die Linkanzahl von tempFolder erhöhen möchten , erstellen Sie ein neues Verzeichnis, und die Anzahl steigt.
ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder
Die Verknüpfung von anotherFolder / zu tempFolder / (was ist ..) wird zur Zählung hinzugefügt.
Da es zwischen den Berechtigungen und dem Besitz angezeigt wird, hat man den Eindruck, dass es sehr wichtig ist, aber ich habe es nie benutzt. Wann wird es normalerweise benötigt?
Emanuel Berg
1
Das ist falsch Es ist die Anzahl der Links, Punkt. Für Verzeichnisse haben Sie 2 für den Eintrag im übergeordneten Verzeichnis (wie bei jeder Datei) und den .Eintrag in sich selbst sowie einen für die ..Einträge in jedem seiner Unterverzeichnisse.
Stéphane Chazelas
@StephaneChazelas Die gesamte Dokumentation, die ich gefunden habe, handelt von der Anzahl fester Links (z. B. linuxgazette.net/issue35/tag/links.html ). Ich fand auch, dass eine ähnliche Frage in AskUbuntu gestellt wurde ( askubuntu.com/questions/19510/… ). Ich werde den Quellcode von coreutils überprüfen und sehen, ob ich die genaue Antwort herausfinden kann.
Damien
2
@EmanuelBerg wenn Dateisysteme waren weit weniger zuverlässig als sie jetzt sind und Sie arbeiteten auf dem Dateisystem , das Sie entwickelt und ls2 Zeichen ausgeben könnte und geben Ihnen mehr Informationen, und es gab keinen stat(1)Befehl noch find(1)noch fscknoch Symlinks es war wahrscheinlich weit mehr nützlich als es heute ist. Es kann nicht geändert werden, ohne Shell-Skripte zu brechen, in die die Autoren längst eingegangen sind /dev/null. Das ist seit mindestens 1979 so.
msw
8
Unter Unix ist eine Datei normalerweise ein Eintrag in einer Dateitabelle. Es gibt verschiedene Arten von Dateien: normale Dateien, Geräte, symbolische Links, Türen, Rohre, Steckdosen, 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 über den Inode, sondern über den Pfad auf Dateien zu . Ein Pfad ist eine Kette von Verzeichniseinträgen . Sie werden feststellen, dass es sich hier nicht um einen Ordner, sondern um ein Verzeichnis handelt . Weil es das ist, was ein Verzeichnis ist (denken Sie an ein Telefonverzeichnis).
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 (genau wie es mehr als einen Namen in einer Telefonnummer geben kann) und kann auch Namen (Einträge) in mehr als einem Verzeichnis haben. Diese werden genannt Links auch bekannt als harte Links mit unterscheiden Softlinks (eine spezielle Art von Datei , die ein Zeiger auf einen Pfad ist).
Eine Datei (Inode) protokolliert die Anzahl der Verknüpfungen (der Einträge in einem beliebigen Verzeichnis), über die sie verfügt, sodass die Zuordnung aufgehoben wird, wenn die Anzahl 0 erreicht (wenn die Verknüpfung zum letzten Verzeichnis, auf das verwiesen wurde, aufgehoben wird).
Das ist die Nummer (die Anzahl der Links), die in der ls -lAusgabe angezeigt wird.
Wenn eine Nicht-Verzeichnis - Datei zum ersten Mal erstellt wird (mit openoder creat(oder bindoder mknodfür einige Arten von Dateien) Systemaufrufe), wird durch die Bereitstellung mit einem Weg in die neuen Datei getan (wie "/a/b"). Was dann passiert, ist, dass eine neue Datei und ein neuer Inode zugewiesen werden und dem Verzeichnis, das dem "a"Namen im "/"Stammverzeichnis zugeordnet ist, ein neuer Eintrag hinzugefügt wird . Das ist der ursprüngliche Link , die Anzahl der Links ist also eins.
Weitere Links können später mit dem link()Systemaufruf (dem lnBefehl) hinzugefügt werden . Und Verknüpfungen können mit dem unlink()Systemaufruf (dem rmBefehl) entfernt werden.
Sie werden feststellen , dass die Dateien vom Typ Verzeichnis im Allgemeinen eine Reihe 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"). Was es dann tut, ist das Zuweisen einer neuen Datei vom Typ Verzeichnis. In diesem neuen Verzeichnis werden automatisch zwei Einträge erstellt:
"."( Punkt für Verzeichnis ). Welches ist eine Verbindung zu sich selbst. Die Anzahl der Links ist jetzt 1.
".."(für das Verzeichnis des Verzeichnisses ). Welches ist ein Link zu "/a". Die Anzahl der Links von "/a"wird also um eins erhöht
Dann wird dieses neue Verzeichnis mit verknüpft "/a"(ein Eintrag wird dafür hinzugefügt "/a"), so dass seine Verknüpfungsanzahl jetzt 2 ist. Wenn ein "/a/b/c"Verzeichnis aufgrund des ".."Eintrags in erstellt wird "/a/b/c", wird die Verknüpfungsanzahl von "/a/b"3.
Die meisten Unices beschränken das Erstellen weiterer Links zu einem Verzeichnis, da dies zu problematischen Schleifen führen kann. Wenn ein link()in einem Verzeichnis zulässig ist, kann dies im Allgemeinen nur der Superuser.
Einige Dateisysteme btrfsweichen von dieser traditionellen Verzeichnisstruktur ab. Sie werden feststellen, dass die Anzahl der Verknüpfungen in Verzeichnissen in btrfsDateisystemen immer eins ist, obwohl diese Verzeichnisse einen "."Eintrag mit derselben Inode-Nummer enthalten wie sie.
Die Tatsache, dass die Anzahl der Verknüpfungen traditionell 2 plus der Anzahl der Unterverzeichnisse beträgt, hat seinen Zweck. Zum Beispiel in:
find . -name '*.c' -print
If .enthält keine Unterverzeichnisse, sondern Millionen von Dateien. Durch Überprüfen der Linkanzahl von .kann findfestgestellt werden, dass es kein Unterverzeichnis gibt. Alles find, was Sie tun müssen, ist, den Inhalt des Verzeichnisses zu lesen und die Einträge zu melden, die auf enden .c(wie grep '\.c$'eine wenige Megabyte große Datei, keine große Sache). Andernfalls findmüsste der Typ jeder einzelnen Datei überprüft werden, um festzustellen, ob Verzeichnisse vorhanden sind, in die er absteigen kann (was zu so vielen lstat()Systemaufrufen führt). Natürlich funktioniert diese Art der Optimierung nicht btrfs(obwohl in modernen Linux-Versionen der Dateityp für einige Dateisysteme (einschließlich btrfs) auch im Verzeichniseintrag gespeichert und vom getdents(2)Systemaufruf zurückgegeben wird, der zum Abrufen der Liste der Einträge verwendet wird in einem Verzeichnis, alsolstat ist noch nicht nötig).
+1, tolle Antwort :) Als ich mir den ls-Quellcode ansah, bemerkte ich, dass die Link-Nummer nach einem Aufruf von stat aktualisiert wurde. Der Befehl stat gibt Ihnen also den Wert von Links für eine Datei oder ein Verzeichnis an.
Damien
Was bedeutet es, -anstelle einer Zahl nach den ls -lAusgabeberechtigungen eine Zahl an der richtigen Stelle zu haben ?
.
Eintrag in sich selbst sowie einen für die..
Einträge in jedem seiner Unterverzeichnisse.ls
2 Zeichen ausgeben könnte und geben Ihnen mehr Informationen, und es gab keinenstat(1)
Befehl nochfind(1)
nochfsck
noch Symlinks es war wahrscheinlich weit mehr nützlich als es heute ist. Es kann nicht geändert werden, ohne Shell-Skripte zu brechen, in die die Autoren längst eingegangen sind/dev/null
. Das ist seit mindestens 1979 so.Unter Unix ist eine Datei normalerweise ein Eintrag in einer Dateitabelle. Es gibt verschiedene Arten von Dateien: normale Dateien, Geräte, symbolische Links, Türen, Rohre, Steckdosen, 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 über den Inode, sondern über den Pfad auf Dateien zu . Ein Pfad ist eine Kette von Verzeichniseinträgen . Sie werden feststellen, dass es sich hier nicht um einen Ordner, sondern um ein Verzeichnis handelt . Weil es das ist, was ein Verzeichnis ist (denken Sie an ein Telefonverzeichnis).
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 (genau wie es mehr als einen Namen in einer Telefonnummer geben kann) und kann auch Namen (Einträge) in mehr als einem Verzeichnis haben. Diese werden genannt Links auch bekannt als harte Links mit unterscheiden Softlinks (eine spezielle Art von Datei , die ein Zeiger auf einen Pfad ist).
Eine Datei (Inode) protokolliert die Anzahl der Verknüpfungen (der Einträge in einem beliebigen Verzeichnis), über die sie verfügt, sodass die Zuordnung aufgehoben wird, wenn die Anzahl 0 erreicht (wenn die Verknüpfung zum letzten Verzeichnis, auf das verwiesen wurde, aufgehoben wird).
Das ist die Nummer (die Anzahl der Links), die in der
ls -l
Ausgabe angezeigt wird.Wenn eine Nicht-Verzeichnis - Datei zum ersten Mal erstellt wird (mit
open
odercreat
(oderbind
odermknod
für einige Arten von Dateien) Systemaufrufe), wird durch die Bereitstellung mit einem Weg in die neuen Datei getan (wie"/a/b"
). Was dann passiert, ist, dass eine neue Datei und ein neuer Inode zugewiesen werden und dem Verzeichnis, das dem"a"
Namen im"/"
Stammverzeichnis zugeordnet ist, ein neuer Eintrag hinzugefügt wird . Das ist der ursprüngliche Link , die Anzahl der Links ist also eins.Weitere Links können später mit dem
link()
Systemaufruf (demln
Befehl) hinzugefügt werden . Und Verknüpfungen können mit demunlink()
Systemaufruf (demrm
Befehl) entfernt werden.Sie werden feststellen , dass die Dateien vom Typ Verzeichnis im Allgemeinen eine Reihe von Links größer oder gleich 2.
Wenn Sie jetzt ein Verzeichnis erstellen, rufen Sie den
mkdir()
Systemaufruf auf. So etwas wiemkdir("/a/b")
. Was es dann tut, ist das Zuweisen einer neuen Datei vom Typ Verzeichnis. In diesem neuen Verzeichnis werden automatisch zwei Einträge erstellt:"."
( Punkt für Verzeichnis ). Welches ist eine Verbindung zu sich selbst. Die Anzahl der Links ist jetzt 1.".."
(für das Verzeichnis des Verzeichnisses ). Welches ist ein Link zu"/a"
. Die Anzahl der Links von"/a"
wird also um eins erhöhtDann wird dieses neue Verzeichnis mit verknüpft
"/a"
(ein Eintrag wird dafür hinzugefügt"/a"
), so dass seine Verknüpfungsanzahl jetzt 2 ist. Wenn ein"/a/b/c"
Verzeichnis aufgrund des".."
Eintrags in erstellt wird"/a/b/c"
, wird die Verknüpfungsanzahl von"/a/b"
3.Die meisten Unices beschränken das Erstellen weiterer Links zu einem Verzeichnis, da dies zu problematischen Schleifen führen kann. Wenn ein
link()
in einem Verzeichnis zulässig ist, kann dies im Allgemeinen nur der Superuser.Einige Dateisysteme
btrfs
weichen von dieser traditionellen Verzeichnisstruktur ab. Sie werden feststellen, dass die Anzahl der Verknüpfungen in Verzeichnissen inbtrfs
Dateisystemen immer eins ist, obwohl diese Verzeichnisse einen"."
Eintrag mit derselben Inode-Nummer enthalten wie sie.Die Tatsache, dass die Anzahl der Verknüpfungen traditionell 2 plus der Anzahl der Unterverzeichnisse beträgt, hat seinen Zweck. Zum Beispiel in:
If
.
enthält keine Unterverzeichnisse, sondern Millionen von Dateien. Durch Überprüfen der Linkanzahl von.
kannfind
festgestellt werden, dass es kein Unterverzeichnis gibt. Allesfind
, was Sie tun müssen, ist, den Inhalt des Verzeichnisses zu lesen und die Einträge zu melden, die auf enden.c
(wiegrep '\.c$'
eine wenige Megabyte große Datei, keine große Sache). Andernfallsfind
müsste der Typ jeder einzelnen Datei überprüft werden, um festzustellen, ob Verzeichnisse vorhanden sind, in die er absteigen kann (was zu so vielenlstat()
Systemaufrufen führt). Natürlich funktioniert diese Art der Optimierung nichtbtrfs
(obwohl in modernen Linux-Versionen der Dateityp für einige Dateisysteme (einschließlichbtrfs
) auch im Verzeichniseintrag gespeichert und vomgetdents(2)
Systemaufruf zurückgegeben wird, der zum Abrufen der Liste der Einträge verwendet wird in einem Verzeichnis, alsolstat
ist noch nicht nötig).quelle
-
anstelle einer Zahl nach denls -l
Ausgabeberechtigungen eine Zahl an der richtigen Stelle zu haben ?