Copias de seguridad

rclone check: cómo comprobar que la copia en la nube es idéntica (y qué no detecta rclone copy)

Publicado el 29 de octubre de 2026Última revisión: 29 de octubre de 20263 min de lectura

Resultado de la prueba

con un byte alterado, mismo tamaño y misma fecha, rclone check lo detectó (código 1), rclone copy no lo reparó y rclone copy --checksum sí; --size-only no vio nada.

Contenido

Este artículo no lleva enlaces de afiliado.

Subir ficheros con rclone copy no demuestra que lo subido sea idéntico. Esta prueba mira qué detecta rclone check y qué no, en un caso incómodo: un fichero corrupto que conserva tamaño y fecha. Continúa el artículo sobre rclone sync y copy.

Condiciones: rclone 1.60.1, cinco ficheros aleatorios de 100 kB, un directorio local como "nube". Script completo al final. No se probó un proveedor real: en algunos, el hash que check compara lo calcula el servidor y puede no estar disponible o ser distinto del local; consulta la tabla de hashes de tu proveedor en la documentación de rclone.

Resultados

Consecuencias prácticas

  1. Automatiza rclone check y vigila el código de salida, no solo el texto. La prueba muestra que copy puede dejar un fichero corrupto sin avisar, y check es quien lo detecta.
  2. Usa --one-way si el destino puede tener ficheros extra legítimos (otras copias, papelera). Sin esa opción, un fichero de más ya cuenta como diferencia.
  3. No te fíes de --size-only para verificar integridad: no detectó la corrupción de la prueba.
  4. Para reparar, copy --checksum; y si usas restic u otra herramienta con repositorio propio, su verificación es otra (comprobación de restic).

Script completo

#!/bin/bash
# rclone check: can it detect a corrupted copy, a missing file and an extra file? Usage: test-rclone-check.sh WORKDIR. Synthetic data, local directory as the "cloud".
W=$1; rm -rf "$W"; mkdir -p "$W/src" "$W/dst"
for i in 1 2 3 4 5; do head -c 100000 /dev/urandom > "$W/src/f$i.bin"; done
rclone copy "$W/src" "$W/dst"
echo "== copia correcta"; rclone check "$W/src" "$W/dst" 2>&1 | tail -2; echo "salida: ${PIPESTATUS[0]}"
echo "== un byte cambiado en destino, mismo tamaño y misma fecha"
touch -r "$W/src/f2.bin" "$W/ref"; printf 'X' | dd of="$W/dst/f2.bin" bs=1 seek=500 conv=notrunc 2>/dev/null; touch -r "$W/ref" "$W/dst/f2.bin"
echo "-- rclone check"; rclone check "$W/src" "$W/dst" 2>&1 | grep -E "ERROR|NOTICE|Failed|differences"; echo "salida: ${PIPESTATUS[0]}"
echo "-- rclone check --size-only"; rclone check "$W/src" "$W/dst" --size-only 2>&1 | tail -1; echo "salida: ${PIPESTATUS[0]}"
echo "-- rclone copy (repite la copia)"; rclone copy "$W/src" "$W/dst" -v 2>&1 | grep -E "Copied|Transferred:" | head -2
echo "-- check tras copy"; rclone check "$W/src" "$W/dst" 2>&1 | tail -1; echo "salida: ${PIPESTATUS[0]}"
echo "-- rclone copy --checksum (compara hashes)"; rclone copy "$W/src" "$W/dst" --checksum -v 2>&1 | grep -E "Copied" | head -2
echo "-- check tras copy --checksum"; rclone check "$W/src" "$W/dst" 2>&1 | tail -1; echo "salida: ${PIPESTATUS[0]}"
echo "== fichero que falta en destino"
rm "$W/dst/f4.bin"; rclone check "$W/src" "$W/dst" 2>&1 | grep -E "ERROR|NOTICE|differences"; echo "salida: ${PIPESTATUS[0]}"
echo "== fichero extra en destino"
rclone copy "$W/src" "$W/dst"; echo extra > "$W/dst/extra.txt"
rclone check "$W/src" "$W/dst" 2>&1 | grep -E "ERROR|NOTICE|differences"; echo "salida: ${PIPESTATUS[0]}"
echo "-- --one-way"; rclone check "$W/src" "$W/dst" --one-way 2>&1 | tail -1; echo "salida: ${PIPESTATUS[0]}"