¿Cómo excluir múltiples directorios con rsync?

184

Estoy tratando de hacer una copia de seguridad de mi directorio de inicio usando rsync, y quiero excluir algunos de los directorios que contienen basura. Quiero excluir específicamente /home/ben/.ccachey /home/ben/build. Desafortunadamente, la documentación para rsync era sobrecarga de información y no respondió mi pregunta. Esto es lo que probé:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/

¿Cuál es la forma correcta de hacer esto?

Freedom_Ben
fuente
44
Solo quería decir que la bandera ya aimplica r:)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
Populus

Respuestas:

238

OK, me siento realmente tonto. Antes de publicar esta pregunta, mi amigo me mostró cómo hacerlo y es realmente simple. Para excluir múltiples directorios, solo usa múltiples --exclude=pathinterruptores. Entonces mi comando arriba escrito correctamente es el siguiente:

rsync -arv --exclude=.ccache --exclude=build /home/ben /media/ben/thumbdrive/
Freedom_Ben
fuente
77
Una ruta absoluta no funcionó para mí (el directorio especificado no se excluyó silenciosamente), mientras que una ruta relativa al directorio fuente funcionó correctamente. Tal vez me falta algo, pero sería cauteloso con la afirmación de @FreeSoftwareServers de que las rutas absolutas siempre funcionan.
Soren Bjornstad
55
FYI: La opción -aincluye -rque -ares redundante.
David
44
Contrariamente a lo que cree FreeSoftwareServers, la ruta de exclusión es relativa a la ruta de origen, NO /. Entonces ese comentario es categóricamente falso y conducirá a fallas si lo sigue. La mejor estrategia es omitir las principales / excluidas para evitar este tipo de error mental. Si la fuente es decir, / home / me y si excluye = '/ mydir /', esto excluye el directorio mydir en / home / me, es decir, excluye / home / me / mydir NOT / mydir / at /. Es desafortunado que no pueda votar ni editar ese comentario, ya que es técnicamente incorrecto y engañará.
Lizardx
3
Para su información para viajeros posteriores, parece que el comentario en cuestión por @FreeSoftwareServer ha sido eliminado. tl; dr: usar rutas relativas
Freedom_Ben
2
¡Si eres tonto, yo también y otros 179 votantes!
Sridhar Sarnobat
108

Cuando tenga varios directorios y / o archivos para excluir, cree un archivo de texto y use el --exclude-frominterruptor. Haga un archivo llamado exclude_me.txty en él enumere sus exclusiones. Ejemplo ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

Entonces su rsync se vería así:

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/

Esta es información sobre las reglas de filtro que pueden ayudar:

  • /dir/ significa excluir la carpeta raíz /dir
  • /dir/*significa obtener la carpeta raíz /dirpero no el contenido
  • dir/ significa excluir cualquier carpeta en cualquier lugar donde el nombre contenga dir/

  • Ejemplos excluidos: /dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfsignifica omitir archivos que comienzan con cfcualquier carpeta dentro de/var/spool/lpd

Consulte también la sección de reglas de filtro en la página del manual.

usuario228759
fuente
44
Es importante tener en cuenta que la carpeta raíz significa la raíz de la transferencia, no el directorio raíz.
jamesdlin
Esta es una respuesta brillante!
Alexander Zhukov
85

También puede excluir varias rutas dentro de llaves:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/
György Ráth
fuente
40
esto funciona bien, solo que no debajo de sh, solo debajo de bash, descubrí "por las malas"
xo
77
No hay espacio después de la coma. Aprendí que de la manera difícil también styl
styl3r
Y no use '' like --exclude = '. Gvfs'
Martin T.
FWIW, creo que las llaves funcionan con ksh. Para otros proyectiles, que probablemente podría utilizar algo como: IFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/. O bien, podría usar varios --excludeargumentos, que tendría que escribir manualmente.
TSJNachos117
1
La razón por la que esto funciona se debe a la "Expansión de la abrazadera", en caso de que alguien quiera ver los detalles.
Shredalert