Est-il possible de renommer un fichier ou un répertoire en utilisant l'inode?

10

J'ai changé le répertoire / home en une partition différente et je n'ai pas pu accéder aux fichiers depuis celui-ci, quelque chose que j'ai pu résoudre à partir de cette question - Comment accédez-vous au contenu d'un montage précédent après être passé à une autre partition? .

Dans le cas où j'avais noté l'inode du répertoire auparavant, serais-je capable de l'utiliser seul pour renommer le répertoire?

vfclists
la source

Réponses:

6

Vous pouvez renommer un fichier (répertoire ou autre) en utilisant uniquement la connaissance de l'inode en utilisant find, mais si (a) le système de fichiers qui le contient n'est pas monté, ou si (b) il y a un autre système de fichiers monté sur un répertoire non vide qui contient le fichier qui vous intéresse, le fichier n'est tout simplement pas accessible par votre système. Dans le cas (a), vous devez monter le système de fichiers avant de pouvoir faire quoi que ce soit au contenu, y compris renommer, et dans le cas (b), vous devez démonter le système de fichiers qui est monté "par-dessus" le répertoire contenant le fichier que vous souhaitez renommer. Il semble que vous posiez des questions sur le cas (b).

Si je vous comprends bien, vous essayez de rendre votre ancien /homerépertoire (qui se trouve sur votre partition racine) accessible, tout en utilisant votre nouvelle partition montée sur /home. Si c'est ce que vous voulez, procédez comme suit:

Fermez tous les fichiers et déconnectez-vous. Connectez-vous ensuite en tant que root(utilisez un terminal virtuel pour cela - appuyez sur Ctrl-Alt-F2) Exécutez ce qui suit:

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

Si tout va bien, déconnectez-vous et reconnectez-vous comme vous-même et tout devrait bien se passer.

Par ailleurs, la commande pour renommer un fichier en utilisant uniquement la connaissance de son inode (en supposant que le fichier se trouve dans le répertoire en cours) est:

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

123456789est le numéro d'inode, bien sûr. (Notez que cela finddétermine le nom de fichier et son chemin d'accès et transmet ces informations à mv; il n'y a aucun moyen de renommer un fichier sans impliquer le nom de fichier existant de quelque manière que ce soit, mais si c'est juste que vous ne connaissez pas le nom de fichier, c'est tout à fait Facile.)

Caractère générique
la source
La commande mv peut-elle être renommée directement en fonction de l'inode? Je suppose que la commande find renvoie le nom de fichier dans sa forme textuelle normale.
vfclists
@vfclists: Non, mvn'acceptera en aucun cas les inodes.
Wildcard
6

Dans un système de fichiers Unix typique, il est structurellement impossible en général de déplacer un fichier en fonction de l'inode. La raison en est que renommer un fichier signifie supprimer son entrée de répertoire du répertoire qui le contient et créer un répertoire ailleurs. Mais l'inode ne contient pas de pointeur vers l'entrée de répertoire, il contient uniquement (pointeurs vers) les métadonnées du fichier (horodatages, autorisations, etc.) et le contenu du fichier.

Pour un fichier avec plusieurs liens durs, lesquels renommeriez-vous? L'inode n'est pas assez d'informations.

Pour un répertoire, sur certains systèmes de fichiers, il serait possible d'agir en fonction de l'inode seul:

  1. Lisez le contenu du répertoire, qui est définitivement accessible depuis l'inode.
  2. Recherchez l'entrée de répertoire pour ... Cela pointe vers le répertoire parent.
  3. Dans le répertoire parent, recherchez une entrée de répertoire avec le bon numéro d'inode.

Cela fait cependant plusieurs hypothèses:

  • Et s'il y a plusieurs entrées pour le même inode? En fait, ce n'est pas un problème: cela n'arrivera presque jamais dans la pratique car la plupart des variantes Unix interdisent les liens durs explicites vers les répertoires.
  • ..Existe- t- il en premier lieu? Cela dépend du type de système de fichiers. Certains systèmes de fichiers ont une entrée explicite pour ..; pour d'autres, ces entrées sont truquées par le pilote du système de fichiers. S'il ..n'existe pas, cette approche est fondamentalement impossible.
  • Même si le système de fichiers comprend des ..liens, il y a un autre obstacle qui pourrait ne pas être évident: l'étape 1 peut être possible à l'intérieur du noyau, mais il n'y a pas d'interface pour cela. De nombreuses variantes Unix n'ont pas d'interface permettant d'ouvrir un fichier via son inode, car cela contournerait les autorisations. Par exemple, un fichier avec des autorisations rwxr-xr-x(c'est-à-dire lisible par tout le monde) qui se trouve dans un répertoire avec des autorisations rwx------(c'est-à-dire accessible uniquement à son propriétaire) n'est accessible à personne d'autre qu'au propriétaire du répertoire. Cela ne peut pas être déterminé à partir de l'inode seul - le fichier pourrait en fait être accessible via un autre lien dur!

Le résultat est que non, il n'est pas possible de faire quoi que ce soit, y compris renommer, avec un fichier donné uniquement son inode. Vous devez avoir un chemin d'accès au fichier.

La seule façon pratique d'agir sur un fichier étant donné son inode est de trouver d'abord un chemin, par exemple avec find -inum, puis d'utiliser le chemin pour agir. Cela n'aide pas dans votre situation, où le fichier est masqué par un point de montage. Il n'y a aucun moyen portable d'accéder aux fichiers masqués par un point de montage; sous Linux, comme vous l'avez découvert, vous pouvez utiliser un montage de liaison.

Gilles 'SO- arrête d'être méchant'
la source
-1

Je vous remercie. Cela a été très utile. Cela me permet de changer les noms encombrants pour la transcription des fichiers vidéo que j'ai téléchargés à partir de YouTube en noms de fichiers plus succincts mais toujours significatifs. Par exemple:

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

... me donne les fichiers:

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

Je considère que c'est une lacune de ce que vous obtenez autrement très utile.

Je peux changer le deuxième nom de fichier comme suit:

$ ls -il "Saving Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox News 29 novembre 2019.en.srt"

... cela me donne la liste des fichiers avec son numéro d'inode dès le début:

13902671 -rw-r - r-- 1 james james 55793998 30 nov 18:44 Sauver Tucker Carlson ce soir 29/11/19 FULL- Breaking Fox News 29 novembre 2019.en.srt

... puis je cours:

mvi 13902671 20191129_tucker.srt

Mon script shell mvi bash est:

#!/bin/bash
inodeNumber=$1
newFileName=$2
find . -maxdepth 1 -inum $inodeNumber -exec mv {} $newFileName \;
James
la source
Cela n'ajoute aucune nouvelle information au-delà de ce qui a été mentionné précédemment. De plus, votre mviscript utilise des variables sans guillemets, ce qui signifie qu'il échouera si l'un des arguments donnés au script contient des espaces (ou éventuellement également lorsqu'ils contiennent des caractères globbing).
Kusalananda