Cómo excluir una carpeta de rsync

60

Estoy tratando de hacer una copia de seguridad de mi carpeta de inicio en mi unidad NAS. Estoy dando esto:

rsync -Paz --exclude-from 'rsync-exclude.txt' /home/chris/ [email protected]:LinuxHome

donde rsync-exclude.txttiene este contenido:

/home/chris/Downloads/*
/home/chris/Downloads/
/home/chris/Downloads/*.*

y está en la misma carpeta donde ejecuto rsync (carpeta de inicio).

Sin embargo, rsync también intenta copiar esta carpeta.

¿Qué estoy haciendo mal?

xpanta
fuente

Respuestas:

88

Está proporcionando rutas absolutas en su lista de exclusión.

Con rsync, todas las rutas de exclusión (o inclusión) que comienzan /están ancladas a la " raíz de la transferencia ".

La raíz de la transferencia en este caso es /home/chris. Si lo hiciste:

rsync -Paz --exclude-from 'rsync-exclude.txt' / [email protected]:

... entonces sus exclusiones deberían funcionar (¡pero estaría copiando todo lo demás en ese sistema de archivos!).

Pero como solo está tratando de sincronizar su directorio de inicio y no hay un subdirectorio de /home/chrisnamed "home/chris/Downloads", rsyncno encuentra nada que coincida.

Intenta eliminar las /home/chrispartes de tu rsync-exclude.txtarchivo.

En realidad, solo debería necesitar una sola línea en el archivo:

/Downloads

Tenga en cuenta que si no especifica el inicio /, y resulta que tiene otros directorios nombrados "Downloads", también se excluirán. Supongo que solo desea excluir su directorio de "nivel superior" (relativo al directorio de origen, también conocido como el directorio "raíz de transferencia") Downloads, por lo que querrá el líder /.

LA MANERA MÁS FÁCIL (para excluir solo algunas rutas)

Si solo necesita excluir un directorio, simplemente haga esto (evitando un archivo separado):

rsync -Paz --exclude /Downloads /home/chris/ [email protected]:LinuxHome

También puede encadenar --excludeetiquetas, así:

rsync -Paz --exclude /Downloads --exclude '/Something Else' --exclude .hiddenFile /home/chris/ [email protected]:LinuxHome

Tenga en cuenta que, dado que no hay barra oblicua, ¡se excluirá .hiddenFilede cualquier directorio que copie!

Pero si tiene más de unas pocas exclusiones, es mejor que tenga --exclude-fromun archivo.

Nota

Veo que lo entendiste bien, pero los nuevos en rsync deberían notar la barra al final de/home/chris/

Para citar la rsyncpágina de manual, "Puede pensar en un final / en una fuente que significa 'copiar el contenido de este directorio' en lugar de 'copiar el directorio por nombre'".

Entonces, si dejó esa barra diagonal final, terminaría con un directorio llamado chrisdentro del directorio de destino, que contiene todo desde /home/chris(¡excepto el Downloadsdirectorio original , por supuesto!).

Lambart
fuente
2

Esto podría ser más fácil para la vista, y solo una nota sobre la exclusión de directorios y sintaxis:

SRC='/home/username'
DST='/run/media/username/EasyStoreRT/rsync'

rsync -avrh --stats                                 \
    --log-file=/home/username/log/rsync-home.log    \
    --exclude='/username/.cache'                    \
    --exclude='/username/.local/share/Trash'        \
    $SRC \
    $DST \

Excluirá esos directorios y todos los archivos dentro de ellos. Por alguna razón, rysnc no estaba agregando / home / username a /.cache. Solo home / se anclaría, así que tuve que agregar / username a cada directorio excluido.

Las páginas de manual dicen, "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". Pero, esa jerarquía parece ser solo el primer directorio en el directorio fuente. Estoy usando bash, versión 4.4.23 (1) -release.

jltrinchard
fuente