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*
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:
--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 bajodesktop.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:
/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
./home/user/secret
: El patrón absoluto /home/user/secret
coincide, por lo que el directorio no se guarda ni se recorre/home/user/foo/home/user/secret
: Ningún patrón coincide, por lo que el directorio se guarda./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./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./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.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?
Comentario más útil
Para responder algunas de sus preguntas:
--exclude foo
excluirá cualquier archivo y directorio llamadofoo
. 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 bajodesktop.ini
coincidirá con todos los archivos llamadosdesktop.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 detmp
, 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 conindex
debajo de/full/path/to/directory/.syncthing
.