restic backup --files-from: lista de rutas, comentarios y rutas que no existen
una ruta inexistente en la lista solo da un aviso y el backup termina con exit 0; los comentarios con # se ignoran con --files-from y no con --files-from-verbatim; las rutas con espacios funcionan sin comillas.
Contenido
Este artículo no contiene enlaces de afiliado.
restic backup --files-from lista.txt copia las rutas de un fichero en lugar de pasarlas por línea de comandos. Es cómodo, pero se probaron tres detalles que importan en un script desatendido.
Condiciones: restic 0.16.4 en Linux arm64, repositorio local, tres carpetas pequeñas (una con espacio en el nombre), contraseña desechable. Script completo al final.
Resultados
| Caso | Resultado |
|---|---|
| Lista con una carpeta y un fichero | ambos entran en el snapshot, exit 0 |
| Ruta con espacio, sin comillas | funciona, exit 0 |
| Línea inexistente en la lista | aviso does not match any files, skipping, el resto se copia, exit 0 |
Comentario # ... y línea en blanco con --files-from |
ignorados, exit 0 |
Misma lista con --files-from-verbatim |
el comentario se trata como ruta: # comentario does not exist, skipping, exit 0 |
Lo que debes saber
El caso peligroso es el tercero: si una carpeta de la lista desaparece (disco sin montar, ruta con errata), el backup sigue y termina con éxito, solo con una línea de aviso. Si usas una lista, comprueba que las rutas existen antes (test -e) o revisa la salida del backup. Esto no se probó con una ruta que existe pero no se puede leer.
Usa --files-from-verbatim si tus nombres de fichero pueden empezar por # o contener caracteres especiales, y escribe una ruta por línea sin comentarios.
Relacionado: códigos de salida de restic y qué se copiaría con --dry-run.
Script completo
#!/bin/bash
# restic backup --files-from / --files-from-verbatim. Usage: test-restic-files-from.sh WORKDIR
W=$1; rm -rf "$W"; mkdir -p "$W/datos/a" "$W/datos/b" "$W/datos/con espacio"
export RESTIC_PASSWORD=prueba-desechable
R="$W/repo"; restic init -r "$R" >/dev/null
echo 1 > "$W/datos/a/uno.txt"; echo 2 > "$W/datos/b/dos.txt"; echo 3 > "$W/datos/con espacio/tres.txt"
ls_() { restic -r "$R" ls latest | grep -E '\.txt$' | sed "s|.*datos/||" | sort | tr '\n' ' '; echo; }
echo "== 1) --files-from con carpeta y fichero"
printf '%s\n' "$W/datos/a" "$W/datos/b/dos.txt" > "$W/lista.txt"
restic -r "$R" backup --files-from "$W/lista.txt" --quiet; echo "exit=$?"; ls_
echo "== 2) ruta con espacio, sin comillas"
printf '%s\n' "$W/datos/con espacio" > "$W/lista2.txt"
restic -r "$R" backup --files-from "$W/lista2.txt" --quiet; echo "exit=$?"; ls_
echo "== 3) ruta inexistente en la lista"
printf '%s\n' "$W/datos/a" "$W/datos/no-existe" > "$W/lista3.txt"
restic -r "$R" backup --files-from "$W/lista3.txt" --quiet 2>&1 | tail -2; echo "exit=${PIPESTATUS[0]}"
echo "== 4) comentario # y linea en blanco"
printf '# comentario\n\n%s\n' "$W/datos/b" > "$W/lista4.txt"
restic -r "$R" backup --files-from "$W/lista4.txt" --quiet; echo "exit=$?"; ls_
echo "== 5) --files-from-verbatim con la misma lista"
restic -r "$R" backup --files-from-verbatim "$W/lista4.txt" --quiet 2>&1 | tail -2; echo "exit=${PIPESTATUS[0]}"; ls_