Wie schließe ich in einem rsync alle Verzeichnisse aus, die einem Muster entsprechen?

8

In einem rsync versuche ich, Unterverzeichnisse auszuschließen, die einem Muster entsprechen. Aber ich kann es nicht zum Laufen bringen. Ich habe einige Beispiele verfolgt, die hier und bei Google gefunden wurden. Aber ich bekomme nicht die richtigen Ergebnisse. Hier ist das Optionsbit meines Befehls:

-avh --exclude 'branch*' --stats --delete --link-dest=$LNK

Meine Quellverzeichnisstruktur ist

/root
    /branch1
    /branch2
    /branch3
    /other
    /stillAnother
    /etc

Dies ist Teil eines Sicherungsskripts. $ LNK ist ein Link zum rsync-Ziel des Vortages.

Ich möchte nicht / root / branch1, / root / branch2, / root / branch3. oder deren zu synchronisierende Inhalte. Aber sie sind.

Hier sind die Ausschlussbits, die ich bereits ausprobiert habe:

--exclude=branch*
--exclude='branch*'
--exclude '/branch*'
--exclude /branch*

Vielen Dank für jede Hilfe / Beratung.

BEARBEITEN - um das Flag "Mögliches Duplikat" zu adressieren

Diese Frage bezieht sich auf eine bekannte Liste von Verzeichnissen. Ich muss alle Verzeichnisse ausschließen, die einem Muster folgen, auch wenn diese Verzeichnisse noch nicht existieren. dh aus meinem Beispiel können andere benannte Verzeichnisse /branch*hinzugefügt werden. Ich muss mein Skript zukunftssicher machen und vermeiden, das Skript zu bearbeiten, wenn ein Verzeichnis hinzugefügt wird, das dem Muster entspricht, da diese Verzeichnisse möglicherweise temporär sind.

Roger Creasy
quelle
Ihr Ausschlussparameter ist in Ordnung. Wenn rsync beim Kopieren den Zweig * ignoriert, ignoriert es ihn auch beim Löschen aus dem Ziel, sodass Sie diese Verzeichnisse am Ziel einmal manuell löschen müssen.
Ipor Sircer
Das Ziel ist ein neues, leeres Verzeichnis, das von meinem Bash-Skript erstellt wurde. Ich habe die Verzeichnisse branch * aus dem Verzeichnis link-dest gelöscht, ohne Erfolg.
Roger Creasy
1
Sie müssen ein explizites vollständiges Muster verwenden, wie *branch*oder /root/branch*nicht, die Kurzform branch*wird nicht gefunden und ist daher nicht ausgeschlossen.
Kondybas
@Kondybas Also, alles ist in meinen Optionen in Ordnung, außer dass ich meinem Ausschlusszweig ein '*' voranstellen muss? ( --exclude '*branch*)
Roger Creasy

Antworten:

2

Sie schließen Regel ist korrekt. Rsync löscht jedoch keine ausgeschlossenen Dateien auf dem Ziel ohne den zusätzlichen Parameter --delete-excluded:

--delete-excluded also delete excluded files from dest dirs

Beispiel:

#  tree test
test
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

#  tree test2
test2
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

# rsync -avh test/ test2 --delete --exclude='branch1' --delete-excluded
sending incremental file list
deleting branch1/

sent 140 bytes  received 27 bytes  334.00 bytes/sec
total size is 0  speedup is 0.00

#  tree test2
test2
|-- 123
|-- branch2
|-- branch3
`-- other

3 directories, 1 file
M. Glatki
quelle
Ich habe meine Optionen im Skript in " -avh --exclude 'branch*' --stats --delete --delete-excluded --link-dest=$LNKLetzte Nacht" geändert und die Verzeichnisse / branch * gesichert.
Roger Creasy
1

rsync Version 3.1.3 (möglicherweise früher, nicht überprüft) schließt Unterverzeichnisse mit dieser Syntax korrekt aus (offensichtlich durch exclude_dirnamedas Muster ersetzen, das Sie ausschließen möchten):

rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/

Dies funktioniert auch mit Platzhaltern. Ursprüngliche Frage verwendet 'branch*', so funktioniert dies:

rsync [other opts...] --exclude='*/branch*/' /src/ /dst/

Hoffe das hilft.

Aaron Danielson
quelle