¿Qué sucede al mover archivos vinculados entre sistemas de archivos usando `mv`?

¿Qué sucede al mover archivos vinculados entre sistemas de archivos usando `mv`?

Tengo una colección de carpetas en un sistema de archivos que han sido vinculadas entre sí (los contenidos son idénticos).

¿Qué sucede cuando muevo una de las carpetas a otro sistema de archivos en otro disco?

Estoy en Mac OSX Snow Leopard y estoy usando el mvcomando de línea de comando.

Respuesta1

No, el valor predeterminado mvlo hacenopreservar enlaces duros:

~$ cual mv
/bin/mv
~$ uname -a
Darwin mini.local 13.4.0 Darwin Kernel Versión 13.4.0: domingo 17 de agosto a las 19:50:11 PDT de 2014; raíz:xnu-2422.115.4~1/RELEASE_X86_64 x86_64

~$ cd /Volúmenes/Copia de seguridad\ principal/
Prueba de copia de seguridad primaria$ mkdir
Copia de seguridad primaria$ prueba de cd/
prueba$ eco foo > a
prueba$ en ab
prueba$ ls -li ab
14271856 -rw-r--r-- 2 usuarios del personal 4 15 de octubre 19:23 a
14271856 -rw-r--r-- 2 personal de usuario 4 15 de octubre 19:23 b
prueba$ cd..
Copia de seguridad primaria$ mv test ../Copia de seguridad\ secundaria/
Copia de seguridad primaria$ ls -li ../Copia de seguridad\ secundaria/prueba/
total 32
11040478 -rw-r--r-- 1 usuario personal 4 15 de octubre 19:23 a
11040479 -rw-r--r-- 1 usuario personal 4 15 de octubre 19:23 b

Respuesta2

Nota

Carpetas en un sistema de archivos que han sido vinculadas entre sí.

Generalmente en UnixNo se admite la vinculación directa de directorios entre sí.. Supongo que te refieres a "los archivos de un directorio son enlaces físicos a archivos de otro directorio".


mvcomportamiento

Digamos que tiene muchos archivos vinculados entre sí, es decir, muchas rutas que conducen a los mismos datos almacenados una vez dentro del sistema de archivos.

Compararesta respuesta de Unix y Linux SE. La parte relevante:

Un movimiento entre sistemas de archivos (no importa si está en el mismo medio físico o no) se maneja como una copia de un archivo seguida de una eliminación. De hecho, esto es exactamente lo que mvhace el comando. Obviamente eso significa que el sistema de archivos de destino tiene que hacer una nueva copia del archivo.

Después de realizar una copia, mvelimina la fuente de manera similar a rm.Estese aplica:

rmsimplemente elimina el puntero. Si tiene varios punteros al archivo (enlaces físicos), eliminar uno de esos punteros rmdeja a los demás completamente intactos y los datos aún están disponibles.

Entonces, si mueve algunos de los archivos vinculados a otro sistema de archivos,otros enlaces duros estarán seguros. Los enlaces duros no pueden cruzar sistemas de archivos, por lo que la nueva copia no puede ser un enlace duro a nada que quede en el sistema de archivos de origen.

Si mueve todos los archivos vinculados, todos desaparecerán del sistema de archivos de origen y aparecerán en el de destino. Tenga en cuenta que incluso uno solo mv(mover varios archivos) creará cada archivo nuevo por separado,no másestar estrechamente vinculados entre sí. En teoría, mvse podría realizar algún trabajo adicional para detectar enlaces físicos y recrearlos en el sistema de archivos de destino, pero no es así (como se muestra enesta otra respuesta).


Mover enlaces duros para obtener enlaces duros

Hay otras herramientas que recrean enlaces duros, tares una de ellas (aunque no puedo decir si taren Mac OS X es seguro). Comparareste:

De forma predeterminada, si indica tararchivar un archivo con vínculos físicos y se incluye más de uno de esos vínculos entre los archivos que se van a archivar, archiva el archivo solo una vez y registra el segundo (y cualquier nombre adicional) como vínculo físico. Esto significa que cuando extraiga ese archivo, se restaurarán los enlaces físicos.

Tenga en cuenta que los vínculos físicos se restaurarán entre los archivos restaurados (es decir, imitarán las conexiones de vínculo físico de la fuente), pero los archivos restaurados nunca se volverán a vincular a los archivos de origen (o sus vínculos físicos que aún puedan existir), incluso si ya no están disponibles. extraídos al mismo sistema de archivos tardel que los obtuvieron.

Para aprovecharlo tarsin crear un archivo grande, necesita algunos trucos de shell. P.ej :

tar -c /source/dirA/ /source/file1  | { cd /foo/destination/ && tar -x; }

El comando realiza la copia sin eliminar. Si necesita eliminar la fuente, hágalo eventualmente con un comando separado.

información relacionada