Wie geht Linux mit einem Move-Befehl um?

12

Wie geht Linux mit einem Bewegungsbefehl unter der Haube um?

Nehmen wir an, ich ziehe nach Hause

/home/me

und ich verschiebe dies in ein anderes Verzeichnis

/home/foo/me

Wie werden alle Dateien und Verzeichnispfade megeändert? Ich weiß, dass mein DesktopVerzeichnis mejetzt /home/foo/me/Desktopgenauso gut ist, Documents /home/foo/me/Documentsaber aktualisiert das Dateisystem explizit jeden Verzeichnispfad me, um die Änderung widerzuspiegeln? Das klingt nicht sehr effizient und es ist wahrscheinlich nicht so.

Wo kann ich mehr darüber erfahren?

Jeff
quelle
5
Über Effizienz: Nein, das wäre nicht effizient. Wenn Sie Daten in ein anderes Verzeichnis verschieben, werden die Daten nicht an einer Stelle gelesen und an einer anderen geschrieben. Ein Dateisystem enthält eine Reihe von Zeigern auf Datenblöcke. Im Falle eines Zuges werden nur die Zeiger aktualisiert.
Jos
Ah, das ist wahrscheinlich, was Jeff meinte ...
Jacob Vlijm
@Jos Woher kommt die Fragmentierung?
Zero298,
3
@ zero298 Nein, Fragmentierung ist im Allgemeinen eine völlig andere und nicht zusammenhängende Sache. Bei Fragmentierung geht es nicht um den Inhalt der Ordnerstruktur, sondern um den Inhalt einer einzelnen Datei, die über die physischen Platten verteilt ist (anstatt eine einzige durchgehende Zeile zu sein), wodurch das Lesen verringert wird / Leistung solcher Dateien schreiben. Es wird normalerweise nicht erwartet, dass der Inhalt großer / tiefer / verzweigter Ordnerbäume fortlaufend ist und auf diese Weise verschoben wird.
Peteris

Antworten:

21

Um zu verstehen, wie es Ordner verschiebt, müssen Sie möglicherweise etwas über das Dateisystem unter Linux wissen. Alle Dateien und Ordner werden als Teil einer Datenstruktur gespeichert, die als " Inode " bezeichnet wird. Jede Datei hat eine Inode-Nummer, ebenso Ordner.

Verwenden Sie den Befehl, um den Inode Ihres Ordners anzuzeigen ls -ial foldername. Die erste Spalte zeigt die Inode-Nummer der Datei. Für jeden Ordner gibt es zwei eindeutige Namen .und ..das Verzeichnis des eigenen darstellen, und das übergeordnete Verzeichnis ist.

Sie können ein Experiment durchführen, um ein Verzeichnis (z. B. / home / me / source) mit Unterverzeichnissen und Dateien in ein anderes Verzeichnis (z. B. / home / me / somewhere / else) zu verschieben. Die Inode-Nummer von / home / me / source und der gesamte Inhalt bleiben vor und nach dem Verschieben gleich. Der einzige Unterschied ist die Inode-Nummer von. Diese ..teilt sich ursprünglich die Inode-Nummer von / home / me und wird jetzt zur Inode-Nummer von / home / me / somewhere / else. In einfacher Formulierung, aktualisiert Linux den Link zum Verzeichnis Quelle und dann ist es geschaffen.

Der Inhalt auf der Festplatte wird ohnehin nicht geändert, nur der Inode-Index wird aktualisiert, wenn der Ordner verschoben wird. Dies ist natürlich nicht der Fall, wenn Sie den Ordner an einen anderen physischen Speicherort verschieben.

Kenneth L
quelle
3
Richtig, solange der Umzug nicht die Grenzen des Dateisystems überschreitet.
Kojiro
3

Wenn Sie daran interessiert sind, wie Programme wie mvund cpfunktionieren, denken Sie daran, dass sie Open Source sind und Sie die genaueste Erklärung erhalten, indem Sie den Code durchlesen. Hier finden Sie Links zu allen Kerndienstprogrammen. Insbesondere können Sie finden mv hier

Hugo Buff
quelle
6
you can get the most accurate explanation by reading through the code.Ich bin anderer Ansicht; Ich hatte lange keine Erfahrung mit C und auch jetzt noch bevorzuge ich es nicht. Außerdem wird der Quellcode häufig optimiert und enthält mehr Randfälle als benötigt. Eine symbolische Erklärung hilft oft mehr.
Shelvacu
1
@shelvacu "enthält mehr Randfälle als benötigt". Robuster Code behandelt alle Randfälle, die vorhanden sein können. Es ist jedoch richtig, dass die Darstellung aller Randfälle in der ersten Erläuterung eines Konzepts möglicherweise nicht erforderlich ist.
OregonTrail
@ OregonTrail Sorry, das ist, was ich gemeint habe, der Code hat mehr Rand Fälle, als für eine Erklärung benötigt werden
Shelvacu
Ich bin froh, dass dies Ihr ursprüngliches Gefühl war, aber Sie schienen meine Betonung der " Griffe " immer noch verfehlt zu haben . Gut geschriebene Code nicht haben Rand Fällen ist es Griffe Grenzfälle. ;) Ich weiß, dass du hier von der richtigen Stelle kommst, aber du solltest vorsichtig mit deinen Verben sein.
OregonTrail