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?
--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 las dest
que 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-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.
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.