¿Cómo maneja Linux un comando de movimiento?

12

¿Cómo maneja Linux un comando de movimiento bajo el capó?

Digamos que muevo mi directorio de inicio

/home/me

y muevo esto a otro directorio

/home/foo/me

¿Cómo se mecambian todas las rutas de archivos y directorios ? Sé que mi Desktopdirectorio bajo meahora es /home/foo/me/Desktoptan bueno como, Documents /home/foo/me/Documentspero ¿el sistema de archivos actualiza explícitamente cada ruta mepara reflejar el cambio? Eso no suena muy eficiente y probablemente no sea esto.

¿Dónde puedo obtener más información sobre esto?

Jeff
fuente
55
Sobre eficiencia: no, eso no sería eficiente. Cuando mueve datos a otro directorio, los datos no se leen realmente en un lugar ni se escriben en otro. Un sistema de archivos contiene un conjunto de punteros a bloques de datos. En el caso de un movimiento, solo se actualizan los punteros.
Jos
Ah, eso es probablemente lo que Jeff quiso decir ...
Jacob Vlijm
@Jos ¿De dónde viene la fragmentación, verdad?
zero298
3
@ zero298 No, la fragmentación generalmente es un isse completamente diferente y no relacionado: la fragmentación no se trata del contenido de la estructura de la carpeta, sino del contenido de un solo archivo que se encuentra disperso por los discos del disco físico (en lugar de ser una sola línea continua), lo que reduce la lectura / escribir el rendimiento de dichos archivos. El contenido de los árboles de carpetas grandes / profundos / ramificados generalmente no se espera que sea continuo y se mueva de esa manera.
Peteris

Respuestas:

21

Para comprender cómo mueve las carpetas, es posible que necesite comprender un poco sobre el sistema de archivos en Linux. Todos los archivos y carpetas se almacenan como parte de una estructura de datos llamada " inodo ". Cada archivo tiene un número de inodo, al igual que las carpetas.

Para ver el i-nodo de la carpeta, utilice el comando ls -ial foldername. La primera columna muestra el número de inodo del archivo. Para cada carpeta hay dos nombres únicos .y .., que representan el directorio propio y el directorio principal, respectivamente.

Puede intentar hacer un experimento para mover un directorio (por ejemplo, / home / me / source) con subdirectorios y archivos a otro directorio (por ejemplo, / home / me / somewhere / else). El número de inodo de / home / me / source y todo su contenido permanece igual antes y después de mover. La única diferencia es el número de inodo de .., que originalmente comparte el número de inodo de / home / me y ahora se convierte en el número de inodo de / home / me / somewhere / else. En una redacción simple, Linux actualiza el enlace a la fuente del directorio y luego está listo.

El contenido del disco duro no se modifica de todos modos, solo el índice de inodo se actualiza cuando se mueve la carpeta. Por supuesto, este no es el caso si mueve la carpeta a una ubicación física diferente.

Kenneth L
fuente
3
Correcto, siempre que el movimiento no cruce los límites del sistema de archivos.
kojiro
3

Si está interesado en cómo funcionan programas como mvy cp, recuerde que son de código abierto y puede obtener la explicación más precisa leyendo el código. Aquí tiene enlaces a todas las utilidades principales. Específicamente, puedes encontrar mv aquí

Hugo Buff
fuente
66
you can get the most accurate explanation by reading through the code.Siento disentir; Durante mucho tiempo no tuve absolutamente ninguna experiencia con C, e incluso ahora no lo prefiero. Además, el código fuente a menudo se optimiza y contiene más casos extremos de los necesarios. Una explicación simbólica a menudo ayuda más.
Shelvacu
1
@shelvacu "contiene más casos extremos de los necesarios". El código robusto maneja todos los casos extremos que pueden estar presentes. Sin embargo, es cierto que presentar todos los casos límite en la primera explicación de un concepto puede no ser necesario.
OregonTrail
@OregonTrail Lo siento, eso es lo que quise decir, el código tiene más casos extremos que las necesidades de una explicación
Shelvacu
Me alegro de que ese fuera tu sentimiento original, pero aun así parecías haber perdido mi énfasis en " manijas ". El código bien escrito no tiene casos extremos, maneja casos extremos. ;) Sé que vienes del lugar correcto aquí, pero debes tener cuidado con tus verbos.
OregonTrail