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.