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í:
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.--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.