restic find: encontrar en qué copia estaba un fichero borrado (y el silencio cuando no lo encuentra)
restic find listó las 2 copias que contenían el fichero borrado; con mayúsculas distintas no devolvió nada y salió con código 0, igual que con un nombre que no existe.
Este artículo no contiene enlaces de afiliado.
Alguien borró contrato.txt y no sabes de qué fecha era la versión buena. Con decenas de snapshots, abrirlos uno a uno no es práctico. restic find busca un nombre en todos. Se probó con tres copias.
Condiciones: restic 0.16.4, repositorio local, contraseña desechable y datos sintéticos. Copia 1: contrato.txt con "v1". Copia 2: el mismo fichero cambiado a "v2". Copia 3: el fichero borrado y otro nuevo. Script completo al final. No se probó con repositorios grandes ni remotos, donde la búsqueda puede tardar más.
Buscar por nombre
restic -r REPO find contrato.txt
restic devolvió dos bloques, uno por cada snapshot que contenía el fichero (la primera y la segunda copia), con la ruta completa. La tercera, donde ya estaba borrado, no aparece. Esa es la pista: la última copia con el fichero es la versión que quieres recuperar.
El patrón con comodín ('contrato*') encontró las mismas 2 copias.
Mayúsculas y el silencio
Con CONTRATO.txt la búsqueda no devolvió nada, y con -i (ignorar mayúsculas) volvió a encontrar las 2 copias. Lo importante: la búsqueda sin resultados terminó con código 0 y sin mensaje, igual que con un nombre inexistente (nada.txt). Un script que use restic find para comprobar que un fichero está en la copia no puede fiarse del código de salida: hay que contar las líneas de la salida.
Recuperar la versión buena
Con el identificador del snapshot (aquí el más antiguo) se restaura solo ese fichero:
restic -r REPO restore ID --target DESTINO --include "*/contrato.txt"
El fichero restaurado contenía "v1". Más detalle en restaurar un fichero concreto; y conviene probar la restauración antes de necesitarla.
Script completo
#!/bin/bash
# restic find: locate a file across snapshots. Usage: test-restic-find.sh WORKDIR. Throwaway password, synthetic data.
set -e
W=$1; rm -rf "$W"; mkdir -p "$W/data/docs"
export RESTIC_PASSWORD=prueba-desechable
R="$W/repo"; restic init -r "$R" >/dev/null
echo "v1" > "$W/data/docs/contrato.txt"; restic -r "$R" backup "$W/data" >/dev/null
echo "v2 cambiado" > "$W/data/docs/contrato.txt"; restic -r "$R" backup "$W/data" >/dev/null
rm "$W/data/docs/contrato.txt"; echo otro > "$W/data/docs/otro.txt"; restic -r "$R" backup "$W/data" >/dev/null
echo "== A) find contrato.txt"; restic -r "$R" find contrato.txt 2>&1 | sed -E 's/[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9:]+/FECHA/'
echo "== B) find 'contrato*' (comodin)"; restic -r "$R" find 'contrato*' 2>&1 | grep -c "contrato.txt" || true
echo "== C) find CONTRATO.txt (mayusculas)"; restic -r "$R" find CONTRATO.txt 2>&1 | tail -2
echo "== D) find -i CONTRATO.txt"; restic -r "$R" find -i CONTRATO.txt 2>&1 | grep -c "contrato.txt"
echo "== E) restaurar la version 1"
ID=$(restic -r "$R" snapshots --compact | grep -oE "^[0-9a-f]{8}" | head -1)
restic -r "$R" restore "$ID" --target "$W/rest" --include "*/contrato.txt" >/dev/null; cat "$W/rest$W/data/docs/contrato.txt"