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.