Zum Beispiel habe ich eine Datei myold_file
. Dann ln
erstelle ich einen Hardlink als mylink
:
ln myold_file mylink
Dann ls -a
kann ich , selbst wenn ich es benutze , nicht sagen, welches das alte ist.
Gibt es sowieso etwas zu erzählen?
Zum Beispiel habe ich eine Datei myold_file
. Dann ln
erstelle ich einen Hardlink als mylink
:
ln myold_file mylink
Dann ls -a
kann ich , selbst wenn ich es benutze , nicht sagen, welches das alte ist.
Gibt es sowieso etwas zu erzählen?
Antworten:
Dies ist nicht möglich, da es sich buchstäblich um dieselbe Datei handelt, die nur über verschiedene Pfade erreichbar ist. Der erste hat keinen besonderen Status.
.bashrc
ist eine Datei, die ... enthält", wenn wir meinen, "der relative Pfad .bashrc
bezieht sich auf eine Datei, die ... enthält", handelt es sich um eine häufige Verschmelzung von Kategorien, und wir sollten verstehen, wann immer man darauf verweist Ein Pfad oder ein Verzeichniseintrag ist eine Datei. Damit ist die Datei gemeint, auf die sie verweist. Nach diesem Verständnis können zwei feste Verknüpfungen dieselbe Datei sein. Wenn sie diese Konvention zugunsten der formalen Sprache ablehnen, können sie das nicht. Beide Haltungen haben ihren Platz :-)
Es gibt keinen direkten, sauberen (zuverlässigen) Weg, dies zu tun. Unter geeigneten Umständen kann dies jedoch möglich (oder zumindest wahrscheinlich) sein. Das Problem ist, dass es zwei feste Links gibt, aber nur eine Datei. Änderungen, Modifikationen und (möglicherweise) Erstellungszeitpunkte werden nur für Dateien (Inodes) gespeichert, nicht jedoch für Verzeichniseinträge (die festen Links). Daher können die gewünschten Informationen nur Sekundäreffekten entnommen werden, die durch Vorgänge, die nicht mit der Datei zusammenhängen, leicht zerstört werden können. Und Sie können nicht einmal sehen, ob es zerstört wurde. Das können Sie aus den betrieblichen Gegebenheiten nur erkennen, wenn Sie diese genau kennen.
Die Erstellung einer festen Verknüpfung ist eine Schreiboperation in das Verzeichnis, das die Verknüpfung enthält. Dadurch werden die Verzeichnisse aktualisiert mtime
. Also wenn
Die Links befinden sich in verschiedenen Verzeichnissen
Wenn Sie wissen, dass keines dieser Verzeichnisse geändert wurde (Datei hinzugefügt, gelöscht, umbenannt oder Metadaten geändert), nachdem der zweite feste Link erstellt wurde, können Sie einfach die mtime
s der Verzeichnisse vergleichen.
Sonderfall: Wenn eines der Verzeichnisse ein mtime
vor der Datei (inode) hat mtime
und Sie sicher sein können, dass die Datei nicht später als einen kurzen Moment nach ihrer Erstellung geschrieben wurde, ist die Verknüpfung dieses Verzeichnisses die ältere.
Wenn sich die Links im selben Verzeichnis befinden (was in Ihrer Frage der Fall zu sein scheint), wird es schlimmer. Dann können Sie verwenden
ls -lU
um sich einen Eindruck von der Reihenfolge zu verschaffen, in der die Einträge erstellt wurden. Dies muss nicht die richtige Reihenfolge sein, da Einträge möglicherweise gelöscht werden, sodass neue Einträge in der Mitte der Verzeichnisliste vorgenommen werden. Und wie Gilles betonte, funktioniert es mit neueren Dateisystemen überhaupt nicht.
ls -lU
modernen Dateisystemen (ext4, btrfs, zfs) funktioniert der Trick jedoch nicht, da Einträge in der Erstellungsreihenfolge überhaupt nicht angezeigt werden.
rm myold_file
Fall mylink
wäre, würden sie immer noch existieren und einwandfrei funktionieren, da dies ein ebenso guter Eintrag ist, der sich auf dieselbe zugrunde liegende Inode bezieht. Erst wenn beide gelöscht wurden, kann das System den Inode verwerfen. Sobald zwei Dateisystemeinträge, die auf dieselbe Datei verweisen, durch feste Verknüpfung erstellt wurden, sind sie gleichwertig. (Beachten Sie, dass "Datei" hier "eine Inode" bedeutet, die die Daten für eine Datei im Gegensatz zu einem Verzeichnis enthält.) Siehe: de.wikipedia.org/wiki/Inode
Wenn Sie sich auf die letzte Änderungszeit der Verzeichnisse verlassen und nicht wissen, wie und wann diese Verzeichnisse geändert werden, führt die Verwendung von mtime zu einem gewissen Prozentsatz von Zeitfehlern. Das Problem hierbei ist, dass die Datei im Dateisystem durch einen Inode und nicht durch einen Verzeichniseintrag dargestellt wird. Der Verzeichniseintrag (Dateiname) zeigt auf den Inode, nicht auf die Datei.
Ich denke, ich würde ein bisschen nachsehen, warum ich wissen muss, welcher Verzeichniseintrag älter ist und wie ich vermeiden kann, dass ich das wissen muss.
Ich denke, diese Frage ist (ziemlich vernünftig) falsch, was eine harte Verbindung wirklich ist. Ich denke jedoch, dass die direkteste Antwort "Sie sind beide" ist .
Unix-Dateisysteme speichern normalerweise den eigentlichen Dateiinhalt und die eigentlichen Daten in i-Nodes. Diese haben keinerlei Pfad, die Pfade stehen dann in einer Beziehung zu diesen i-Nodes. Nehmen Sie als Analogie eine Person, die zwei Namen trägt, Bob und Joe. Man kann nicht sagen, dass Bob älter ist als Joe oder umgekehrt, es sind nur Namen für dieselbe Person.
Wenn Sie das Konzept einer "ursprünglichen" und einer neuen Datei beibehalten möchten, suchen Sie wahrscheinlich stattdessen nach einem symbolischen Link. Dies ist eher ein Alias, nur eine Anweisung an das Betriebssystem, dass auf einem Pfad so vorgegangen werden soll, als ob sie waren zu einem anderen, ohne die Dateistruktur darunter zu ändern. (Diese können Sie mit "ln -s file link" erstellen.
Der Kern der Antwort, die oben von mehreren anderen gegeben wurde, ist, dass jeder Dateiname eine feste Verknüpfung zu einer Datei ist. Es gibt kein echtes Original, nur möglicherweise ein erstes.
Stellen Sie sich ein Verzeichnis als eine Tabelle vor, in der Dateinamen und Inode-Nummern aufgelistet sind.
Jede feste Verbindung, einschließlich der ersten, ist ein Eintrag in einem Verzeichnis, das der Inode-Nummer einen "Dateinamen" zuweist, damit Sie unter diesem Namen auf die Datei zugreifen können.
Die Datei ist eine Sammlung von Blöcken auf der Festplatte, die von in einem Inode gespeicherten Metadaten verwaltet und verfolgt werden. Eine Datei hat eine Inode-Nummer.
Der Zugriff auf die Daten einer Datei über den Dateinamen erfolgt in drei Schritten: Der Dateiname wird im Verzeichnis nachgeschlagen, um die Inode-Nummer zu erhalten. Auf den Inode wird dann Bezug genommen, um den relevanten Plattenblock (oder die Blöcke) zu finden, die die Daten enthalten. Dann werden diese Blöcke endlich gelesen / geschrieben.
Das mit nach Hause nehmen von allem, was im Grunde genommen so ist: Es gibt absolut keinen Unterschied zwischen dem Zugriff auf Dateiinhalte mit dem ersten ("Original") oder später erstellten harten Links.
ls > a; ln a b; rm a; ln b c
, welche ist "origineller" als die andere?a
ist weg, Sie bleiben mitb
undc
...