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?
fuente
cmp
lugar de hashing. Tiene dependencias y los mismos problemaswhile read
que 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.--delete-during receiver deletes during the transfer
y también varias otras alternativas útiles:--delete --delete-before --delete-delay --delete-after --delete-excluded
. Entonces, sí, rsync es la mejor alternativa,mv
comando? Quizás con*
adjunto a la ruta de origen si la fuente original era un directorio.rsync --delete*
que sería un desastre ! ¡Eliminará cosas de lasdest
que no están actualmentesrc
, por lo que todos los archivos que se movieron con éxito en el intento anterior ahora se eliminarán! Probablemente estabas pensando enrsync --remove-source-files
lo que acepto sería una buena alternativa. ( more1 , more2 )rsync --delete
será 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.Respuestas:
Olvídate de intentar reinventar rsync y usa rsync.
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íandrive2
, como conmv -i
, es más complicado, porque ahora necesita distinguir los archivos que ya se han copiado y los que no. Puede pasar la--ignore-existing
opción a rsync para omitir los archivos que ya existen en el destino, independientemente de su contenido. Tenga en cuenta que si el originalmv
se interrumpió en medio de la creación de un archivo, este archivo permanecerá en su estado medio copiado (mientras que un archivo desnudorsync -a
terminarí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
mv
para 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.fuente
rsync
hace lo que intentas hacer, mientrasmv
que 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/rsyncmv
(o el administrador de archivos) porque solo mueve una referencia al archivo / directorio. Si necesito hacer una transferencia de datos real, entonces lo usorsync
si 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,rsync
es simplemente la herramienta adecuada, ymv
, ocp
no lo son.