mkdir -p test/a/b/c/d/e
mkdir -p test/dest
rsync -nvraL test/a test/dest --exclude=a/b/c/d
Esto funciona. Como test/a es el directorio base desde el que se sincroniza, el patrón de exclusión se especifica comenzando con a/
Muéstranos las rutas/exclusiones reales si esto no ayuda.
Ejecutar rsync con -vn mostrará una lista de directorios/archivos:el patrón se compara con el formato que imprime rsync.
Cualquiera de estos funcionaría:
rsync -nvraL test/a test/dest --exclude=/a/b/c/d
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
Tenga en cuenta el final / en la ruta de origen hace una diferencia crítica en cómo --exclude debe especificarse. Esto supone que tenemos:
mkdir -p test/a/b/c/d/e
mkdir -p test/a/other/place/a/b/c/d
mkdir -p test/dest
La publicación original tiene dificultades cuando la ruta de exclusión comienza con un / . La respuesta de Daniel es correcta que este / inicial en la ruta de exclusión podría ser deseable excluir una ruta específica, y que este / inicial debe entenderse como líder ^ en expresiones regulares. Sin embargo, su respuesta tiene un error tipográfico crítico sobre el final / en la ruta de origen.
Siguiendo el ejemplo de Erik, quieres hacer esto:
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
En realidad, ni la respuesta de Erik ni la de Antoni son del todo precisas.
Erik tiene la mitad de razón al decir eso
Como test/a es el directorio base desde el que se sincroniza, el patrón de exclusión se especifica comenzando con a/
Es cierto que la raíz del patrón de exclusión es test/a (es decir, el patrón /some/path se une a test/a/some/path ), pero esa no es toda la historia.
Desde la página del manual:
si el patrón comienza con / entonces está anclado a un lugar particular en la jerarquía de archivos, de lo contrario, se compara con el final del nombre de la ruta. Esto es similar a un ^ inicial en expresiones regulares. Por lo tanto, "/foo" coincidiría con un archivo llamado "foo" en la "raíz de la transferencia" (para una regla global) o en el directorio del archivo combinado (para una regla por directorio).
Podemos ignorar el per-directory bit ya que no se aplica a nosotros aquí.
Por lo tanto, rsync -nvraL test/a test/dest --exclude=a/b/c/d definitivamente excluirá test/a/b/c/d (e hijos), pero también excluirá test/a/other/place/a/b/c/d .
rsync -nvraL test/a test/dest --exclude=/b/c/d , por otro lado, excluirá solo test/a/b/c/d (e hijos) (test/a siendo el punto al que / está anclado).
Es por eso que aún necesita la barra inclinada inicial de anclaje si desea excluir esa ruta específica de ser respaldado. Esto puede parecer un detalle menor, y lo será cuanto más específico sea su patrón de exclusión (por ejemplo, Pictures contra home/daniel/Pictures ), pero puede que te muerda el trasero.