Restic: No se pueden encontrar documentos para la sintaxis del archivo de exclusión

Creado en 8 jun. 2017  ·  17Comentarios  ·  Fuente: restic/restic

Parece que no puedo encontrar ningún documento sobre cómo se analiza la sintaxis del archivo de exclusión.

es decir, ¿admite comodines? regex? ¿Cómo diferencia entre archivos y directorios? ¿Se necesitan prefijos de ruta? ¿de dónde (cwd / o root?)?

Algunos ejemplos:

.qiv-trash (directory that could be anywhere on the filesystem)
.DS_Store
lost+found/
._*
desktop.ini
Thumbs.db (file that could be anywhere on the filesystem)
.Trash-* (the asterisk could be any number, is it needed?)
.tmp$ (file ending in .tmp)
~$ (file ending in a tilde)
~/.cache/ (cache directory in user home dir, using tilde syntax)
/full/path/to/directory/.syncthing/index*
documentation wanted

Comentario más útil

Para responder algunas de sus preguntas:

  • Todos los patrones se prueban con la ruta completa de un archivo / directorio que se va a guardar.
  • Las rutas / patrones relativos coincidirán en cualquier lugar debajo de la ruta que se guardará
  • Por el momento no hay forma de distinguir entre un archivo y un directorio, por lo que --exclude foo excluirá cualquier archivo y directorio llamado foo . Lo mismo ocurre con --exclude foo/ .

De su archivo de exclusiones:

  • ._* coincidirá con todos los archivos y directorios cuyo nombre comience con un punto y un guión bajo
  • desktop.ini coincidirá con todos los archivos llamados desktop.ini exactamente. Por lo tanto, desktop.ini.bak no se excluye ni se guarda en la instantánea.
  • .Trash-* excluye archivos / directorios denominados .Trash- , .Trash-foobar , etc.
  • .tmp$ excluye todos los archivos / directorios literalmente llamados .tmp$ , que es un punto, seguido de tmp , seguido de un signo de dólar. Sin expansión de expresiones regulares.
  • ~$ excluye todos los archivos / directorios literalmente llamados tilde dollar. Para excluir todos los archivos / directorios que terminan en tilde, use *~ .
  • ~/.cache excluye el directorio .cache en todos los directorios llamados tilde. Para excluir el directorio de caché solo en su directorio de inicio, use $HOME/.cache (la tilde no se expande, las variables de entorno sí, pero solo en un archivo leído a través de --exclude-file , en la línea de comandos el shell se expande ambos).
  • /full/path/to/directory/.syncthing/index* excluye todas las cosas con nombres que comienzan con index debajo de /full/path/to/directory/.syncthing .

Todos 17 comentarios

Hola has visto

Los patrones utilizan filepath.Glob internamente, consulte filepath.Match para conocer la sintaxis. Además ** excluye subdirectorios arbitrarios. Las variables de entorno en archivos de exclusión se expanden con os.ExpandEnv.

en https://github.com/restic/restic/blob/master/doc/manual.rst?

Creo que esto debería responder a sus preguntas.

Fui a la documentación en https://restic.readthedocs.io/en/latest/manual.html y busqué exclude, donde desafortunadamente no incluye ningún ejemplo común (o una referencia a la otra documentación en manual.rst ): /

Leí el documento de golang y creo que el usuario final (¡yo!) No va a saber con qué restic está comparando una exclusión internamente: ¿es la ruta completa (por ejemplo, / home / me / blah) o una ruta desde el raíz del repositorio (/ blah o blah), o relativo al cwd (yo / blah cuando estoy en / home)?

Gracias por plantear este problema, creo que tiene un punto válido. El manual debe explicar los filtros de exclusión sin hacer referencia a godoc.org, y se necesitan más ejemplos.

Para responder algunas de sus preguntas:

  • Todos los patrones se prueban con la ruta completa de un archivo / directorio que se va a guardar.
  • Las rutas / patrones relativos coincidirán en cualquier lugar debajo de la ruta que se guardará
  • Por el momento no hay forma de distinguir entre un archivo y un directorio, por lo que --exclude foo excluirá cualquier archivo y directorio llamado foo . Lo mismo ocurre con --exclude foo/ .

De su archivo de exclusiones:

  • ._* coincidirá con todos los archivos y directorios cuyo nombre comience con un punto y un guión bajo
  • desktop.ini coincidirá con todos los archivos llamados desktop.ini exactamente. Por lo tanto, desktop.ini.bak no se excluye ni se guarda en la instantánea.
  • .Trash-* excluye archivos / directorios denominados .Trash- , .Trash-foobar , etc.
  • .tmp$ excluye todos los archivos / directorios literalmente llamados .tmp$ , que es un punto, seguido de tmp , seguido de un signo de dólar. Sin expansión de expresiones regulares.
  • ~$ excluye todos los archivos / directorios literalmente llamados tilde dollar. Para excluir todos los archivos / directorios que terminan en tilde, use *~ .
  • ~/.cache excluye el directorio .cache en todos los directorios llamados tilde. Para excluir el directorio de caché solo en su directorio de inicio, use $HOME/.cache (la tilde no se expande, las variables de entorno sí, pero solo en un archivo leído a través de --exclude-file , en la línea de comandos el shell se expande ambos).
  • /full/path/to/directory/.syncthing/index* excluye todas las cosas con nombres que comienzan con index debajo de /full/path/to/directory/.syncthing .

Gracias @ fd0

Entonces, con "directorio actual", no te refieres al directorio en el que estaba cuando lancé la copia de seguridad, sino al directorio que está actualmente examinando los archivos (aparte de las exclusiones que comienzan con una barra). Entiendo.

El comportamiento de los archivos y directorios es un poco inesperado, habría esperado --excluir foo / para hacer una copia de seguridad del directorio pero no del contenido, mientras que --excluir foo para hacer una copia de seguridad de ninguno de los dos. No estoy seguro de por qué, supongo que de rsync.

Mis ejemplos perdieron uno importante: ¡los espacios! Supongo que necesito escapar de esos y de los metacaracteres de shell con una barra invertida.

Terminé copiando muchos de estos: https://gist.github.com/jult/e2eaedad6b9e29d95977fea0ddffae7d

¿Se permiten comentarios en el archivo de exclusiones? Editar: https://github.com/restic/restic/pull/916/commits/c796d84fca48feea91ca3e85fbf38e16f764a468 parece que un hash es el carácter de comentario.

Ah, me temo que eso todavía no es del todo correcto. Describiré cómo restic evalúa los patrones de exclusión. Supongamos que un usuario ejecuta restic en su directorio de inicio ( /home/user ) así:

$ restic backup --exclude='*.bak' --exclude='/home/user/secret' --exclude='extra' ~

Entonces restic verá los siguientes argumentos de línea de comando (después de la expansión por el shell):

["restic", "backup", "--exclude='*.bak'", "--exclude='/home/user/secret'", "--exclude='extra'", "/home/user"]

Luego, comienza a atravesar /home/user . La siguiente lista describe lo que sucede cuando se ve el archivo / directorio nombrado. restic siempre prueba la ruta completa contra los patrones:

  • file /home/user/foo.bak : El patrón *.bak coincide y el archivo no se guarda. El patrón no es absoluto, por lo que coincide en todas partes para todos los archivos que terminan en .bak .
  • dir /home/user/secret : El patrón absoluto /home/user/secret coincide, por lo que el directorio no se guarda ni se recorre
  • dir /home/user/foo/home/user/secret : Ningún patrón coincide, por lo que el directorio se guarda.
  • dir /home/user/work/extra : El patrón extra coincide, el directorio no se guarda.

Espero que esto esté un poco más claro ahora, agregaré una sección al manual que describe el proceso. El punto clave es que los patrones se evalúan contra la ruta completa de los archivos durante la copia de seguridad. Entonces, si desea hacer coincidir un solo directorio, use la ruta completa; de lo contrario, puede coincidir varias veces en algún lugar.

¿Alguna otra pregunta? :)

Tengo más preguntas y agradezco mucho el tiempo que dedica a responderlas. Es realmente una pregunta sobre el anclaje automágico de patrones. Creo que puedo adivinar la respuesta (confiamos en que el camino absoluto es bastante único y nos da el comportamiento que queremos), pero es mejor preguntar y estar seguro.

¿El patrón absoluto /home/user/secret coincidiría con /home/user/secret2 ? (¿Y si no quieres?)
¿El patrón absoluto /home/user/secret coincidiría con /home/user/somemount/home/user/secret ?

En ambos casos: No, el patrón no coincidirá.

¿Porqué es eso? Editar: me complace que no sea así, pero no veo por qué es así :)

El código coincidente se basa en lo que haría un shell: si se preguntara a sí mismo, si el archivo /home/user/secret2 existe, ¿qué ls /home/user/secret imprimiría (siempre que el archivo secret no existe)?

En términos más formales: si el patrón comienza con / , es absoluto y el patrón debe coincidir con el comienzo de la cadena bajo prueba, por lo que el patrón /home/user/secret no coincide con /home/user/somemount[...] : El patrón no es un prefijo de la cadena.

Puede imaginarse que el patrón y la ruta del archivo están divididos en sus respectivos componentes:

  • /home/user/secret se divide en [ROOT, "home", "user", "secret"] y el archivo /home/user/somemount/home/user/secret se divide en [ROOT, "home", "user", "somemount", "home", "user", "secret"] . La cadena ROOT se usa en este ejemplo para marcar el directorio raíz. Puede ver que el patrón no está incluido en el nombre del archivo.

    • Veamos el archivo /home/user/secret2 , que se divide en [ROOT, "home", "user", "secret2"] . Nuevamente, puede ver que el patrón no está incluido en el nombre del archivo.

  • Para el archivo /home/user/secret/secret.txt , que se divide en [ROOT, "home", "user", "secret", "secret.txt"] , puede ver que el patrón está contenido en el nombre del archivo, justo al principio: [ROOT, "home", "user", "secret", ...] , por lo tanto, el patrón coincide y el archivo está excluido.
  • Digamos que tenemos un patrón de exclusión relativo de secret/secret.txt , que se divide en ["secret", "secret.txt"] . Puede ver que este patrón se puede encontrar en la lista del archivo /home/user/secret/secret.txt , comenzando en el desplazamiento 3: [ROOT, "home", "user", "secret", "secret.txt"] , por lo que el patrón coincide.

Cuando tiene comodines ( * , ? y así sucesivamente) en un componente de ruta, también se prueban. Entonces, para su primer ejemplo, un patrón de /home/user/secret* coincidiría con la ruta /home/user/secret2 .

Todos estos ejemplos deberían estar documentados en el manual, creo.

Entendido. Gracias.

¿Son posibles las exclusiones negativas ala .gitignore?
digamos que quiero excluir todo el contenido en los directorios llamados .meteor excepto el directorio anidado .meteor / local / db, ¿podría hacer esto?

/ etc / restic / excluye:
.meteor/ !.meteor/local/db
restic backup exclude-file=/etc/restic/excludes

No, eso aún no está implementado.

La documentación de ejemplos de inclusión / exclusión se rastrea en el n. ° 396, estoy cerrando este problema aquí.

@ fd0 Estoy tratando de excluir rutas como trabajos a continuación / / trabajos / / builds / ** / archive para excluir el directorio de archivos de todos los directorios, ¿funcionaría? Y tengo varias rutas como esta que necesito excluir, si es posible, ¿puede sugerirme la mejor manera de tratar este tipo, ya que no puedo encontrar ningún ejemplo de ese tipo en la documentación?

¿Fue útil esta página
0 / 5 - 0 calificaciones