el directorio de exclusión rsync no funciona


34

Estoy ejecutando Fedora 17 de 64 bits y rsync --exclude=/home/ben/<dir>no funciona como se esperaba.

Estoy tratando de rsyncllevar mi directorio de inicio a una unidad de disco USB, pero quiero excluir ciertamente los directorios que contienen archivos de caché y archivos de compilación. Este es el comando que estoy usando:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

Sin embargo, el contenido de ~/buildy ~/.ccacheestá siendo copiado por rsync. ¿Qué estoy haciendo mal?


1
Creo que excluir patrones simplemente no funciona.
Sören

Respuestas:


37

Las rsyncreglas de filtro global que comienzan con un líder /están ancladas a la raíz de la transferencia. Citando de la sección "INCLUIR / EXCLUIR REGLAS DE PATRÓN" de la página del manual:

Si el patrón comienza con un / entonces está anclado a un punto particular en la jerarquía de archivos, de lo contrario, se compara con el final del nombre de ruta. Esto es similar a un ^ inicial en expresiones regulares. Por lo tanto, "/ foo" coincidiría con el nombre de "foo" en la "raíz de la transferencia" (para una regla global) o en el directorio del archivo de fusión (para una regla por directorio).

En su comando ( rsync ... -arv /home/ben home-ben/), el archivo /home/ben/foose transferirá a home-ben/ben/foo. La raíz de la transferencia es home-beny la ruta de filtro correcta es /ben/foo. Así,

  • para que coincida /home/ben/.ccachenecesita una ruta de filtro de/ben/.ccache
  • para que coincida /home/ben/build/necesita una ruta de filtro de/ben/build/

Se puede encontrar una explicación más detallada en la sección "ANCLAJE INCLUYE / EXCLUYA PATRONES" de la rsync(1)página del manual .


Tenga en cuenta que simplemente omitir el líder /no es necesariamente lo que desea. Citando nuevamente desde la misma sección de la página man:

Un "foo" no calificado coincidiría con un nombre de "foo" en cualquier parte del árbol porque el algoritmo se aplica de forma recursiva de arriba hacia abajo; se comporta como si cada componente de ruta tuviera un giro al ser el final del nombre de archivo. Incluso el "sub / foo" no anclado coincidiría en cualquier punto de la jerarquía donde se encontrara un "foo" dentro de un directorio llamado "sub". Vea la sección sobre ANCLAJE INCLUYE / EXCLUYA PATRONES para una discusión completa de cómo especificar un patrón que coincida en la raíz de la transferencia.

Por lo tanto, un patrón de filtro de build/coincidiría con un directorio de compilación en cualquier lugar /home/ben, incluso /home/ben/many/sub/directories/build/.


2
El detalle clave es que las barras son importantes. Si agrega una barra al final del directorio de origen (rsync -a fuente / destino) copiará el contenido de la fuente, de lo contrario rsync -a source destinationcopiará el directorio de origen en el destino. Esto determina cuál será la raíz de la transferencia para informar la expresión de exclusión. El uso adecuado de / en la expresión de exclusión se explica más arriba. Tenga en cuenta en particular que rsync --exclude='/dir1' source destinationno excluirá nada.
pgoetz

11

Creo que sus excluderutas deben ser relativas a la ruta de origen. ¿Puedes probar esto en su lugar?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/

Aquí hay una prueba, para comparar:

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a

2
Esta respuesta es incorrecta. ¡Con una ruta de exclusión relativa, excluiría el patrón en todas partes!
rubo77

Esta publicación es correcta. La coincidencia está basada en texto, no en archivo. Cualquier ruta que --verbosemuestre el resultado del comando es el formato que debe usar.
Sridhar Sarnobat

Esto funcionó para mí.
Zhenyu

¿Qué pasa si la ruta de origen es '/', entonces absoluta son las rutas relativas, pero todavía no funciona?
Sören

Esto es lo único que funcionó para mí.
Jonathan

2

Tuve este problema en un script (no sé si es tu caso). Lo hice porque usé este comando en un script y estaba usando sh en lugar de bash. verifique el shebang al comienzo de su secuencia de comandos.


1

Su patrón de exclusión funcionaría si sincroniza la ruta completa / de inicio, es decir, sin una barra inclinada final:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

Pero mejor solo rsync el contenido de la carpeta con una barra inclinada final:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/

También puede usar una lista de ignorados, consulte: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders


0

Para excluir una carpeta específica con rsync, debe considerar la ruta relativa en el comando. en tu caso:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/

donde "ben" es la carpeta que está sincronizando

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.