Ist es möglich, eine Datei oder ein Verzeichnis mit dem Inode umzubenennen?

10

Ich habe das Verzeichnis / home in eine andere Partition geändert und konnte von dort aus nicht auf die Dateien zugreifen. Dies konnte ich anhand dieser Frage lösen. Wie können Sie auf den Inhalt eines vorherigen Mount zugreifen, nachdem Sie zu einer anderen Partition gewechselt haben? .

Falls ich zuvor den Inode des Verzeichnisses notiert hätte, könnte ich das allein verwenden, um das Verzeichnis umzubenennen?

vfclists
quelle

Antworten:

6

Sie können eine Datei (Verzeichnis oder was auch immer) umbenennen, indem Sie nur den Inode kennen find, aber wenn (a) das Dateisystem, das sie enthält, nicht gemountet ist oder wenn (b) ein anderes Dateisystem über einem nicht leeren Verzeichnis gemountet ist, das das enthält Datei, an der Sie interessiert sind, auf die Datei kann Ihr System einfach nicht zugreifen. In Fall (a) müssen Sie das Dateisystem bereitstellen, bevor Sie etwas an den Inhalten vornehmen können, einschließlich des Umbenennens. In Fall (b) müssen Sie das Dateisystem aushängen, das "über" dem Verzeichnis bereitgestellt wird, das das enthält Datei, die Sie umbenennen möchten. Es sieht so aus, als würden Sie nach Fall (b) fragen.

Wenn ich Sie richtig verstehe, versuchen Sie, Ihr altes /homeVerzeichnis (das sich auf Ihrer Root-Partition befindet) zugänglich zu machen, während Sie weiterhin Ihre neue Partition verwenden, die unter gemountet ist /home. Wenn Sie dies möchten, gehen Sie wie folgt vor:

Schließen Sie alle Dateien und melden Sie sich ab. Melden Sie sich dann an als root(verwenden Sie dazu ein virtuelles Terminal - drücken Sie Strg-Alt-F2) Führen Sie Folgendes aus:

umount /home
mv /home /home-old
mkdir /home
mount -a
ls /home
ls /home-old

Wenn alles in Ordnung ist, melden Sie sich als Sie selbst ab und wieder an, und alles sollte in Ordnung sein.

Im Übrigen lautet der Befehl zum Umbenennen einer Datei nur unter Kenntnis ihres Inodes (vorausgesetzt, die Datei befindet sich im aktuellen Verzeichnis):

find . -maxdepth 1 -inum 123456789 -exec mv {} mynewname \;

Wo 123456789ist natürlich die Inode-Nummer? (Beachten Sie, dass Sie finddie Dateinamen und den Pfad bestimmt und leitet diese Informationen an mv, es gibt keine Möglichkeit , überhaupt eine Datei umbenennen , ohne Einbeziehung der vorhandenen Dateinamen in irgendeiner Weise, aber wenn es nur ist , dass Sie nicht wissen , die Dateinamen, es ist ganz einfach.)

Platzhalter
quelle
Kann der Befehl mv direkt basierend auf dem Inode umbenannt werden? Ich gehe davon aus, dass der Befehl find den Dateinamen in seiner normalen Textform zurückgibt.
vfclists
@vfclists: Nein, mvakzeptiert Inodes in keiner Weise.
Wildcard
6

In einem typischen Unix-Dateisystem ist es im Allgemeinen strukturell unmöglich, eine Datei basierend auf dem Inode zu verschieben. Der Grund dafür ist, dass beim Umbenennen einer Datei der Verzeichniseintrag aus dem Verzeichnis entfernt wird, in dem sie enthalten ist, und an anderer Stelle ein Verzeichnis erstellt wird. Der Inode enthält jedoch keinen Zeiger auf den Verzeichniseintrag, sondern nur (Zeiger auf) die Dateimetadaten (Zeitstempel, Berechtigungen usw.) und den Dateiinhalt.

Welche davon würden Sie für eine Datei mit mehreren Hardlinks umbenennen? Der Inode reicht nicht aus.

Für ein Verzeichnis wäre es auf einigen Dateisystemen möglich, nur mit dem Inode zu handeln:

  1. Lesen Sie den Inhalt des Verzeichnisses, der definitiv vom Inode aus erreichbar ist.
  2. Suchen Sie den Verzeichniseintrag für ... Dies zeigt auf das übergeordnete Verzeichnis.
  3. Suchen Sie im übergeordneten Verzeichnis nach einem Verzeichniseintrag mit der richtigen Inode-Nummer.

Dies macht jedoch mehrere Annahmen:

  • Was ist, wenn es mehrere Einträge für denselben Inode gibt? Eigentlich ist das kein Problem: Das wird in der Praxis kaum passieren, da die meisten Unix-Varianten explizite feste Links zu Verzeichnissen verbieten.
  • Existiert überhaupt ..? Dies hängt vom Dateisystemtyp ab. Einige Dateisysteme haben einen expliziten Eintrag für ..; Für andere werden diese Einträge vom Dateisystemtreiber gefälscht. Wenn ..es keinen gibt, ist dieser Ansatz grundsätzlich unmöglich.
  • Selbst wenn das Dateisystem ..Links enthält, gibt es einen weiteren Stolperstein, der möglicherweise nicht offensichtlich ist: Schritt 1 ist möglicherweise im Kernel möglich, aber es gibt keine Schnittstelle dafür. Viele Unix-Varianten haben keine Schnittstelle, über die eine Datei über ihren Inode geöffnet werden kann, da dies die Berechtigungen umgehen würde. Beispielsweise ist eine Datei mit Berechtigungen rwxr-xr-x(dh weltweit lesbar), die sich in einem Verzeichnis mit Berechtigungen befindet rwx------(dh nur für den Eigentümer zugänglich ist), nur für den Verzeichnisbesitzer zugänglich. Dies kann nicht allein anhand des Inodes festgestellt werden - die Datei könnte tatsächlich über einen anderen festen Link zugänglich sein!

Das Ergebnis ist, dass es nicht möglich ist, irgendetwas zu tun, einschließlich des Umbenennens, wenn eine Datei nur ihren Inode hat. Sie benötigen einen Pfad zur Datei.

Die einzige praktische Möglichkeit, auf eine Datei mit ihrem Inode zu reagieren, besteht darin, zuerst einen Pfad zu finden, z. B. mit find -inum, und dann den Pfad zum Handeln zu verwenden. Das hilft in Ihrer Situation nicht, in der die Datei von einem Einhängepunkt beschattet wird. Es gibt keine tragbare Möglichkeit, auf Dateien zuzugreifen, die von einem Einhängepunkt beschattet werden. Wie Sie festgestellt haben, können Sie unter Linux einen Bind-Mount verwenden.

Gilles 'SO - hör auf böse zu sein'
quelle
-1

Vielen Dank. Dies war sehr hilfreich. Es ermöglicht mir, umständliche Namen für die Abschrift von Videodateien, die ich von YouTube heruntergeladen habe, in prägnantere, aber dennoch aussagekräftige Dateinamen zu ändern. Beispielsweise:

you-get -O 20191129_tucker https://www.youtube.com/watch?v=cyCpkwX9Wvs

... gibt mir die Dateien:

20191129_tucker.webm; und "Saving Tucker Carlson Tonight 11-29-19 FULL-Breaking Fox News 29. November 2019.en.srt"

Ich halte dies für ein Manko des ansonsten sehr nützlichen Erhaltens.

Ich kann den zweiten Dateinamen wie folgt ändern:

$ ls -il "Saving Tucker Carlson Tonight 29.11.19 FULL- Breaking Fox News 29. November 2019.en.srt"

... das gibt mir gleich zu Beginn die Dateiliste mit der Inode-Nummer:

13902671 -rw-r - r-- 1 james james 55793998 30. November 18:44 Speichern von Tucker Carlson Heute Abend 29.11.19 VOLL- Breaking Fox News 29. November 2019.en.srt

... dann renne ich:

mvi 13902671 20191129_tucker.srt

Mein mvi bash Shell-Skript lautet:

#!/bin/bash
inodeNumber=$1
newFileName=$2
find . -maxdepth 1 -inum $inodeNumber -exec mv {} $newFileName \;
James
quelle
Dies fügt keine neuen Informationen hinzu, die über die zuvor genannten hinausgehen. Darüber hinaus verwendet Ihr mviSkript nicht zitierte Variablen, was bedeutet, dass es fehlschlägt, wenn eines der dem Skript angegebenen Argumente Leerzeichen enthält (oder möglicherweise auch, wenn sie Globbing-Zeichen enthalten).
Kusalananda