rclone check: cómo comprobar que la copia en la nube es idéntica (y qué no detecta rclone copy)
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
- Copia correcta:
0 differences found, 5 ficheros coinciden, código de salida 0. - Un byte cambiado en destino (mismo tamaño y misma fecha):
f2.bin: md5 differ,1 differences found, código de salida 1. - El mismo caso con
--size-only:5 matching files, código 0. Comparar solo el tamaño no vio la corrupción. - Repetir
rclone copy: no transfirió nada (0 B) ychecksiguió fallando. Con tamaño y fecha iguales,copyda el fichero por bueno. rclone copy --checksum:f2.bin: Copied (replaced existing); despuéscheckdio 5 ficheros coincidentes y código 0.- Fichero que falta en destino:
file not in ... dst,1 files missing, código 1. - Fichero de más en destino: también código 1 (
file not in ... src). Con--one-waysolo se comprueba que lo del origen esté en el destino, y el código fue 0.
Consecuencias prácticas
- Automatiza
rclone checky vigila el código de salida, no solo el texto. La prueba muestra quecopypuede dejar un fichero corrupto sin avisar, ycheckes quien lo detecta. - Usa
--one-waysi el destino puede tener ficheros extra legítimos (otras copias, papelera). Sin esa opción, un fichero de más ya cuenta como diferencia. - No te fíes de
--size-onlypara verificar integridad: no detectó la corrupción de la prueba. - 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]}"