Las mejores prácticas para continuar mv

13

Usé el terminal para copiar archivos de una unidad a otra.

sudo mv -vi /location/to/drive1/ /location/to/drive2/

Sin embargo, eso se detuvo repentinamente, mientras pasaban algunas horas, y sin un error, después de crear un directorio.

Mi propia solución a eso es a menudo una mezcla de hashing y comparación, que es en su mayoría un desastre que consume mucho tiempo, ya que ahora tengo que recuperarme de una copia intermedia sin saber realmente qué archivos faltan (escrito como una sola línea muy larga para zsh - tenga en cuenta que este script no funciona en bash como está escrito):

source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
    echo "${hash_and_file}" | read hash file;
    echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
    echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
    mv -v "${copy_from}" "${copy_to}" | tee -a log;
    rm -v "${copy_from}" | tee -a log; };
done <<<$(
    comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${source_directory}: :g" | sort;
           ) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${target_directory}: :g" | sort; ) )

Esto es propenso a errores si el directorio de destino del nombre o directorio_origen es parte de la ruta y elimina archivos si no se han movido porque se marcaron como duplicados. Además, no fuente directorio al final.

¿Existe alguna práctica recomendada para recuperarse de un MV interrumpido?

Qué
fuente
Escribí un script similar , que usa en cmplugar de hashing. Tiene dependencias y los mismos problemas while readque mencionó Gilles. También es lento y detallado. Pero libera espacio en disco antes que el método rsync, porque los archivos se (re) mueven de la fuente a medida que se ejecutan. Puede servir de inspiración para los valientes.
joeytwiddle 01 de
3
@joeytwiddle ofertas rsync --delete-during receiver deletes during the transfery también varias otras alternativas útiles: --delete --delete-before --delete-delay --delete-after --delete-excluded. Entonces, sí, rsync es la mejor alternativa,
Isaac
Debo estar perdiendo algo. ¿Por qué no solo se repite el mismo mvcomando? Quizás con *adjunto a la ruta de origen si la fuente original era un directorio.
jpa
@isaac ¡No, me temo rsync --delete*que sería un desastre ! ¡Eliminará cosas de las destque no están actualmente src, por lo que todos los archivos que se movieron con éxito en el intento anterior ahora se eliminarán! Probablemente estabas pensando en rsync --remove-source-fileslo que acepto sería una buena alternativa. ( more1 , more2 )
joeytwiddle
@joeytwiddle No, rsync --deleteserá solamente quitar otros archivos que no son parte de la fuente. Desde [man rsync] () * borre archivos extraños de los directorios de destino *. Comprende lo que significa extraño : no estar sincronizado. Y sí, rsync también proporciona una forma de eliminar los archivos fuente después de que se hayan transmitido correctamente.
Isaac

Respuestas:

46

Olvídate de intentar reinventar rsync y usa rsync.

sudo rsync -av /location/to/drive1/ /location/to/drive2/

Asegúrese de utilizar una barra inclinada final en la fuente, de lo contrario se copiaría en /location/to/drive2/drive1.

Verifique que el comando haya sido exitoso, luego ejecute rm -rf /location/to/drive1/.

El comando anterior sobrescribirá cualquier archivo preexistente de drive2. Si desea solicitar al usuario que omita los archivos que ya existían drive2, como con mv -i, es más complicado, porque ahora necesita distinguir los archivos que ya se han copiado y los que no. Puede pasar la --ignore-existingopción a rsync para omitir los archivos que ya existen en el destino, independientemente de su contenido. Tenga en cuenta que si el original mvse interrumpió en medio de la creación de un archivo, este archivo permanecerá en su estado medio copiado (mientras que un archivo desnudo rsync -aterminaría de copiarlo correctamente).

Si desea reproducir el comportamiento exacto de mv -i, incluida la solicitud, se podría hacer, pero es mucho más complicado.

Tenga en cuenta que su revestimiento de un gigante es muy frágil. Si hay nombres de archivo que contienen barras diagonales inversas o nuevas líneas, es posible que no se copien correctamente o que incluso puedan engañar a su script para que elimine archivos arbitrarios. Por lo tanto , no use el código en la pregunta a menos que esté seguro de que puede confiar en que los nombres de los archivos no contengan barras invertidas o líneas nuevas.

Para referencia futura, recomiendo nunca usarlo mvpara grandes movimientos de transmisión cruzada, precisamente porque es difícil controlar lo que sucede si se interrumpe. Use rsync para hacer la copia y luego elimine el original.

Gilles 'SO- deja de ser malvado'
fuente
¿Qué promesas hace rsync que no hace mv?
Lo que
44
bueno, por ejemplo, rsynchace lo que intentas hacer, mientras mvque no. También: copia entre diferentes máquinas; compresión para transferencia; omitir archivos existentes en el destino en función de la igualdad de marca de tiempo o basada en hash; manejo configurable de propiedad, permisos, enlaces y archivos especiales; etc. linux.die.net/man/1/rsync
Silly Freak
1
@SillyFreak debería concluir a partir de eso, que siempre debería usar rsync en lugar de mv, no solo como Gilles dijo para cross-drive, sino cualquier operación, ya que el límite de "demasiado grande" es relativamente subjetivo y si se trata de un problema habría sido resuelto por rsync de todos modos?
Lo que
99
bueno, cuando muevo archivos o directorios dentro de una partición, generalmente uso mv(o el administrador de archivos) porque solo mueve una referencia al archivo / directorio. Si necesito hacer una transferencia de datos real, entonces lo uso rsyncsi uno de los siguientes es verdadero: 1) Estoy moviendo más archivos de los que puedo verificar la transferencia correcta de un vistazo; 2) Anticipo que tendré que mantener los archivos sincronizados; 3) Espero que la transferencia pueda ser interrumpida. Mi punto es, para el caso de uso se está presentando en la pregunta, rsynces simplemente la herramienta adecuada, y mv, o cpno lo son.
Silly Freak
77
Yo recomendaría ejecutar siempre cualquier comando rsync con -v y —dry-run primero para confirmar exactamente lo que va a hacer.
Darren