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/ admin@192.168.1.65: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?

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' / admin@192.168.1.65:

... 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/ admin@192.168.1.65:LinuxHome

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

rsync -Paz --exclude /Downloads --exclude '/Something Else' --exclude .hiddenFile /home/chris/ admin@192.168.1.65: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!).


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.

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.