¿Es posible cambiar el nombre de un archivo o directorio usando el inodo?


Respuestas:


6

Puede cambiar el nombre de un archivo (directorio o lo que sea) usando solo el conocimiento del inodo usando find, pero si (a) el sistema de archivos que lo contiene no está montado, o si (b) hay otro sistema de archivos montado sobre un directorio no vacío que contiene el archivo que le interesa, el sistema simplemente no puede acceder al archivo. En el caso (a), debe montar el sistema de archivos antes de poder hacer algo con el contenido, incluido el cambio de nombre, y en el caso (b), debe desmontar el sistema de archivos que está montado "sobre la parte superior" del directorio que contiene el archivo que desea cambiar de nombre. Parece que está preguntando sobre el caso (b).

Si te entiendo correctamente, estás intentando hacer /homeaccesible tu antiguo directorio (que se encuentra en tu partición raíz), mientras sigues usando tu nueva partición montada en /home. Si eso es lo que quieres, haz lo siguiente:

Cierre todos los archivos y cierre sesión. Luego inicie sesión como root(use un terminal virtual para esto; presione Ctrl-Alt-F2) Ejecute lo siguiente:

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

Si todo está bien, cierre sesión y vuelva a iniciar sesión como usted mismo y todo debería estar bien.

Por cierto, el comando para cambiar el nombre de un archivo utilizando solo el conocimiento de su inodo (suponiendo que el archivo esté en el directorio actual) es:

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

¿Dónde 123456789está el número de inodo, por supuesto? (Tenga en cuenta que finddetermina el nombre de archivo y su ruta y pasa esta información mv; no hay forma de cambiar el nombre de un archivo sin involucrar el nombre de archivo existente de ninguna manera, pero si es solo que no conoce el nombre de archivo, es bastante simple.)


¿Se puede cambiar el nombre del comando mv directamente en función del inodo? Supongo que el comando find devuelve el nombre del archivo en su forma textual normal.
vfclists

@vfclists: No, mvno aceptará inodos de ninguna manera.
Comodín el

6

En un sistema de archivos típico de Unix, es estructuralmente imposible en general mover un archivo basado en el inodo. La razón es que renombrar un archivo significa eliminar su entrada de directorio del directorio que lo contiene y crear un directorio en otro lugar. Pero el inodo no contiene un puntero a la entrada del directorio, solo contiene (punteros a) los metadatos del archivo (marcas de tiempo, permisos, etc.) y el contenido del archivo.

Para un archivo con múltiples enlaces duros, ¿cuál de estos cambiaría de nombre? El inodo no es suficiente información.

Para un directorio, en algunos sistemas de archivos, sería posible actuar dado solo el inodo:

  1. Lea el contenido del directorio, al que definitivamente se puede acceder desde el inodo.
  2. Localice la entrada del directorio para ... Esto apunta al directorio padre.
  3. En el directorio principal, busque una entrada de directorio con el número de inodo correcto.

Sin embargo, esto hace varias suposiciones:

  • ¿Qué pasa si hay varias entradas para el mismo inodo? En realidad, eso no es un problema: eso casi nunca sucederá en la práctica, ya que la mayoría de las variantes de Unix prohíben enlaces duros explícitos a directorios.
  • ¿Existe ..en primer lugar? Esto depende del tipo de sistema de archivos. Algunos sistemas de archivos tienen una entrada explícita para ..; para otros, estas entradas son falsificadas por el controlador del sistema de archivos. Si ..no existe, este enfoque es fundamentalmente imposible.
  • Incluso si el sistema de archivos incluye ..enlaces, hay otro obstáculo que podría no ser obvio: el paso 1 puede ser posible dentro del núcleo, pero no hay una interfaz para ello. Muchas variantes de Unix no tienen una interfaz que permita abrir un archivo a través de su inodo, ya que eso evitaría los permisos. Por ejemplo, un archivo con permisos rwxr-xr-x(es decir, legible por todo el mundo) que se encuentra en un directorio con permisos rwx------(es decir, accesible solo para su propietario) no es accesible a nadie más que al propietario del directorio. Esto no se puede determinar solo desde el inodo: ¡se puede acceder al archivo a través de otro enlace duro!

El resultado es que no, no es posible hacer nada, incluido el cambio de nombre, con un archivo dado solo su inodo. Necesitas tener una ruta al archivo.

La única forma práctica de actuar en un archivo dado su inodo es encontrar primero una ruta, por ejemplo con find -inum, y luego usar la ruta para actuar. Eso no ayuda en su situación, donde el archivo está sombreado por un punto de montaje. No hay una forma portátil de acceder a archivos sombreados por un punto de montaje; en Linux, como has descubierto, puedes usar un montaje de enlace.


-1

Gracias. Esto ha sido de gran ayuda. Me permite cambiar nombres engorrosos para la transcripción de archivos de video que he descargado de YouTube a nombres de archivos más concisos pero significativos. Por ejemplo:

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

... me da los archivos:

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

Considero que esto es una deficiencia de lo que de otro modo sería muy útil.

Puedo cambiar el segundo nombre de archivo de la siguiente manera:

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

... esto me da la lista de archivos con su número de inodo justo al comienzo:

13902671 -rw-r - r-- 1 james james 55793998 30 de noviembre 18:44 Salvar a Tucker Carlson esta noche 29-11-19 COMPLETO- Breaking Fox News 29 de noviembre de 2019.en.srt

... entonces corro:

mvi 13902671 20191129_tucker.srt

Mi script de shell mvi bash es:

#!/bin/bash
inodeNumber=$1
newFileName=$2
find . -maxdepth 1 -inum $inodeNumber -exec mv {} $newFileName \;

Esto no agrega ninguna información nueva más allá de lo mencionado anteriormente. Además, su mviscript usa variables sin comillas, lo que significa que fallará si alguno de los argumentos dados al script contiene caracteres de espacio en blanco (o potencialmente también cuando contienen caracteres globales).
Kusalananda
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.