examples bash unix rsync

bash - examples - rsync unix



rsync:--include-from vs.--exclude-from ¿cuál es la diferencia real? (2)

En la documentación, los menciona como archivos que contienen listas de patrones para incluir o patrones para excluir. Sin embargo, eso implica que para las inclusiones, todo se considera una exclusión, excepto cuando las cosas coinciden con los patrones. Así, por ejemplo, un archivo de inclusión que contiene:

/opt/**.cfg

Solo debe incluir cualquier archivo llamado * .cfg que exista en cualquier parte del directorio llamado opt cualquier lugar del árbol. Así coincidiría con lo siguiente:

/opt/etc/myfile.cfg /some/dir/opt/myfile.cfg /notopt/opt/some/other/dir/myfile.cfg

Por lo tanto, espero que excluya implícitamente cualquier otra cosa. Pero ese no parece ser el caso, ya que estoy viendo esto en la salida detallada:

*deleting etc/rc.d/init.d/somescript

Entonces, ¿cuál es el trato con --include-from y --exclude-from ? ¿Son solo alias para --filter-from ?


Si a usted (como a mí) le resulta difícil envolver su cabeza alrededor de las FILTER RULES FILTROS en la sección de las páginas de manual, pero tiene un entendimiento básico de find , puede usar esa opción.

Diga que desea sincronizar todo con una fecha específica (ex 2016-02-01 ) en el nombre del archivo o en el nombre del directorio desde /storage/data hasta rsync_test . Haz algo como esto:

cd /storage/data find . -name ''*2016-02-01*'' / | rsync --dry-run -arv --files-from=- /storage/data /tmp/rsync_test


rsync no funciona así. Cualquier archivo con un patrón de nombre de archivo que no coincida con ninguno de los patrones de inclusión o exclusión se considera incluido. En otras palabras, piense en el patrón de inclusión como una forma de anular el patrón de exclusión.

De la docs :

Rsync crea una lista ordenada de opciones de inclusión / exclusión como se especifica en la línea de comandos. Rsync verifica cada archivo y nombre de directorio contra cada patrón de exclusión / inclusión a su vez. Se actúa sobre el primer patrón coincidente. Si es un patrón de exclusión, entonces ese archivo se omite. Si es un patrón de inclusión, ese nombre de archivo no se omite. Si no se encuentra un patrón de inclusión / exclusión coincidente, no se omite el nombre de archivo.

(Énfasis mío)

Por lo tanto, si desea incluir solo archivos específicos, primero debe incluir esos archivos específicos, luego excluir todos los demás archivos:

--include="*/" --include="*.cfg" --exclude="*"

Un par de cosas a tener en cuenta aquí:

  1. Los patrones de include tienen que venir antes que los excluidos, porque el primer patrón que coincide es el que se tiene en cuenta. Si el nombre del archivo coincide con el patrón de exclusión primero, se excluye.

  2. --include="/opt" --include="/opt/dir1" incluir todos los subdirectorios individualmente, como --include="/opt" --include="/opt/dir1" etc. para todos los subdirectorios, o usar --include = "* /" para incluir todos los directorios (no archivos). Fui con la segunda opción por brevedad.

Es peculiar y no muy intuitivo. Así que lea los docs detenidamente (la sección "EXCLUIR PATRONES" en el enlace) y use la --dry-run o -n para asegurarse de que hará lo que cree que debería hacer.