mkdir -p test/a/b/c/d/e
mkdir -p test/dest
rsync -nvraL test/a test/dest --exclude=a/b/c/d
Das funktioniert. Als test/a
das Basisverzeichnis ist, aus dem synchronisiert wird, wird das Ausschlussmuster angegeben, indem mit a/
begonnen wird
Zeigen Sie uns die wahren Pfade/Ausschlüsse, wenn dies nicht hilft.
Das Ausführen von rsync mit -vn listet Verzeichnisse/Dateien auf - das Muster wird mit dem Format abgeglichen, das rsync druckt.
Beides würde funktionieren:
rsync -nvraL test/a test/dest --exclude=/a/b/c/d
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
Beachten Sie die Endung /
im Quellpfad macht einen entscheidenden Unterschied zu --exclude
angegeben werden soll. Dies setzt voraus, dass wir Folgendes haben:
mkdir -p test/a/b/c/d/e
mkdir -p test/a/other/place/a/b/c/d
mkdir -p test/dest
Der Originalbeitrag hat Schwierigkeiten, wenn der Ausschlusspfad mit einem /
beginnt . Daniels Antwort ist richtig, dass dieser anfängliche /
in Ausschlusspfad kann wünschenswert sein, um einen bestimmten Pfad auszuschließen, und dass dieser anfängliche /
sollte als vorangestellte ^
verstanden werden in regulären Ausdrücken. Seine Antwort enthält jedoch einen kritischen Tippfehler bezüglich der Endung /
im Quellpfad.
Nach Eriks Beispiel möchten Sie dies tun:
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
Tatsächlich ist weder Eriks noch Antonis Antwort ganz richtig.
Erik hat damit halbwegs recht
Da test/a das Basisverzeichnis ist, aus dem synchronisiert wird, wird das Ausschlussmuster angegeben, indem mit a/
begonnen wird
Es stimmt, dass der Stamm des Ausschlussmusters ist test/a
(also das Muster /some/path
bindet an test/a/some/path
), aber das ist nicht die ganze Geschichte.
Aus der Manpage:
Wenn das Muster mit einem / beginnt, ist es an einer bestimmten Stelle in der Dateihierarchie verankert, andernfalls wird es mit dem Ende des Pfadnamens abgeglichen. Dies ähnelt einem führenden ^ in regulären Ausdrücken. Somit würde „/foo“ mit einer Datei namens „foo“ entweder im „Stammverzeichnis der Übertragung“ (für eine globale Regel) oder im Verzeichnis der Zusammenführungsdatei (für eine verzeichnisbezogene Regel) übereinstimmen.
Wir können per-directory
ignorieren weil es hier nicht auf uns zutrifft.
Daher rsync -nvraL test/a test/dest --exclude=a/b/c/d
schließt definitiv test/a/b/c/d
aus (und Kinder), aber es schließt auch test/a/other/place/a/b/c/d
aus .
rsync -nvraL test/a test/dest --exclude=/b/c/d
hingegen schließt nur aus test/a/b/c/d
(und Kinder) (test/a
ist der Punkt, an dem /
verankert ist).
Aus diesem Grund benötigen Sie immer noch den verankernden Schrägstrich am Anfang, wenn Sie diesen bestimmten Pfad ausschließen möchten nicht gesichert werden. Dies mag wie ein kleines Detail erscheinen, und es wird so sein, je spezifischer Ihr Ausschlussmuster wird (z. B. Pictures
vs. home/daniel/Pictures
), aber es könnte passieren, dass es dich in den Hintern beißt.