¿Qué hace mv en caso de errores?

18

Acabo de intentar mover un gran árbol de un disco a otro, que era demasiado pequeño. Ahora, me queda algo que realmente no puedo entender: parece que algunos archivos se alejaron del árbol de origen mientras que otros simplemente se copiaron. Esto probablemente no sea cierto, y solo estoy pasando por alto algo, como lo hice cuando revisé el lugar libre en el disco de destino. :RE

El comando era simplemente mv source-dir destination-dir, donde ambos directorios residen en discos diferentes. Estoy usando mv (GNU coreutils) 7.4. En ninguna parte de la página de manual encontré las respuestas a las siguientes preguntas:

  • ¿Se pueden crear archivos truncados?
  • en caso de errores, ¿se eliminará algo en el árbol de origen?
  • ¿Cómo recuperarse (de una manera fácil y rápida)?
maaartinus
fuente

Respuestas:

8

Creo que la introducción a la infopágina responde a todas sus preguntas:

Primero usa parte del mismo código que usa 'cp -a' para copiar los directorios y archivos solicitados, luego (suponiendo que la copia se realizó correctamente) elimina los originales. Si la copia falla, se elimina la parte que se copió a la partición de destino. Si tuviera que copiar tres directorios de una partición a otra y la copia del primer directorio tuvo éxito, pero el segundo no, el primero quedaría en la partición de destino y el segundo y el tercero quedarían en la partición original.

La recuperación no debería ser un problema, ya que los datos se conservan. No sé cuánto intenta ser atómico ( mkdirpor ejemplo, se necesita inspección de la fuente) o si está en su dominio (en comparación con el núcleo), pero podría haber corrupción si la interrupción ocurre cuando ya está eliminando el fuente. En ese punto, ya tendría una buena copia en el directorio de destino, por lo que una simple comprobación de tamaño de bytes podría ser el truco.

EDITAR: Hice algunas pruebas con archivos enormes (algunos G) creados con dd, pero sin resultados concluyentes. Nunca logré copiar solo algunas de las fuentes: o bien cancelé toda la operación (siendo demasiado rápido) o luego no tuve ninguna oportunidad debido al almacenamiento en caché del disco y tal vez al buen diseño del sistema de archivos (mi ^ C siempre aterrizó después de que el movimiento tuvo éxito )

lynxlynxlynx
fuente
1
Con respecto a la página de información, ¿entiendo bien que para cada directorio de origen de la línea de comandos , se elimine si la copia correspondiente se realizó correctamente ? Quiero decir que mv src1 src2 dstfunciona a este respecto similar a mv src1 dst; mv src2 dsty cada uno mv src dstes como cp -a src dst && rm -rf src?
maaartinus
1
Así es como lo entiendo también (solo sus mvs serían mv && mv). Como cp -aya es recursivo, dudo que se aplique a los archivos y directorios individuales encontrados al atravesar el árbol. Hará algunas pruebas más tarde.
lynxlynxlynx
12

Cuando mv se está moviendo a un sistema de archivos diferente, primero copia todos los datos al nuevo sistema de archivos. Una vez que se copian los datos nuevos, se eliminan los datos antiguos. Esto significa que si el movimiento se interrumpe o falla, la ubicación de origen aún debe contener todos los datos.

En cuanto a la recuperación, solo los datos de destino deben estar corruptos. En lugar de usar mv para nuevamente, solo use rsync y luego rm manualmente

rsync -av source-dir/ dest-dir/
rm -rf source-dir
jordanm
fuente