Estoy ejecutando Fedora 17 de 64 bits y rsync --exclude=/home/ben/<dir>
no funciona como se esperaba .
Estoy intentando rsync
mi directorio personal en una memoria 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 ~/build
y ~/.ccache
está siendo copiado por rsync
. ¿Qué estoy haciendo mal?
Comentarios
- Creo que los patrones de exclusión simplemente no ' no funcionan.
Responder
Las reglas de filtro rsync
globales que comienzan con un /
inicial están ancladas a la raíz de Citando de la sección «INCLUIR / EXCLUIR REGLAS DE PATRÓN» de la página de manual:
si el patrón comienza con un /, entonces está anclado a un lugar 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 un nombre de «foo» en la «raíz del transfer «(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/foo
se transferirá a home-ben/ben/foo
. La raíz de la transferencia es home-ben
y la ruta de filtrado correcta es /ben/foo
. Por lo tanto,
- para que coincida con
/home/ben/.ccache
necesita una ruta de filtro de/ben/.ccache
- para que coincida con
/home/ben/build/
necesita una ruta de filtro de/ben/build/
Se puede obtener una explicación más detallada que se encuentra en la sección «ANCHAR INCLUDE / EXCLUYE PATRONES» de la rsync(1)
página de manual .
Tenga en cuenta que simplemente omitir el /
inicial no es necesariamente lo que desea. Citando de nuevo desde la misma sección de la página de manual:
Un «foo» no calificado coincidiría con un nombre de «foo» en cualquier parte del árbol porque se aplica el algoritmo recursivamente de arriba hacia abajo; se comporta como si cada componente de la ruta tuviera un turno al ser el final del nombre del 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». Consulte la sección sobre ANCLAJE DE PATRONES INCLUIDOS / EXCLUIDOS para obtener una explicació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 de /home/ben
, incluso /home/ben/many/sub/directories/build/
.
Comentarios
- El detalle clave es que las barras son importantes . Si agrega una barra al final del directorio fuente (rsync -a fuente / destino), copiará el contenido de la fuente; de lo contrario,
rsync -a source destination
copia el directorio fuente en el destino. Esto determina cuál será la raíz de la transferencia para informar la expresión de exclusión. El uso correcto de / en la expresión de exclusión se explica más arriba. Tenga en cuenta en particular quersync --exclude='/dir1' source destination
no ' excluirá nada.
Respuesta
ADVERTENCIA: Per @ rubo77 «s comentario a continuación , esta respuesta solo debe usarse si está dispuesto a excluir estos elementos en todas partes de su árbol de fuentes, no solo en la raíz. Consulte la respuesta de @ jw013 anterior para obtener una explicación más detallada.
Creo que sus rutas exclude
deben ser relativas a la ruta de origen. ¿Puede ¿Intentas esto en su lugar?
rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/
Aquí «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
Comentarios
- Esta respuesta es incorrecta. ¡Con una ruta de exclusión relativa, excluiría el patrón en todas partes!
- Esta publicación es correcta. La coincidencia se basa en texto, no en inodo de archivo. Cualquiera que sea la ruta que muestre la salida del comando
--verbose
es el formato que debe usar. - Esto funcionó para mí.
- ¿Qué pasa si el la ruta de origen es ' / ', entonces las rutas absolutas son las relativas, pero todavía no ' t funciona.
- Esto es lo único que funcionó para mí.
Responder
Su patrón de exclusión funcionaría, si sincroniza la ruta completa / de inicio, es decirsin una barra al 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 al final:
rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/
También puede utilizar una lista de ignorados, consulte: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders
Respuesta
Tuve este problema en un script (no sé si es tu caso). Lo fue porque usé este comando en un script y estaba usando sh en lugar de bash. verifique el shebang al comienzo de su script.
Comentarios
- ¿Cómo causaría este problema en particular la elección de intérprete de shell?
Respuesta
Para excluir una carpeta específica con rsync, debe considerar la ruta relativa en el comando. en su caso:
rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/
donde «ben» es la carpeta que está sincronizando