Wie kann ich eine Reihe von Unterverzeichnissen per rsync synchronisieren?

Wie kann ich eine Reihe von Unterverzeichnissen per rsync synchronisieren?

Ich habe ein Quellverzeichnis, das wie folgt aussieht (mit zahlreichen Unterverzeichnissen innerhalb der Verzeichnisse „src“ und „bin“):

  • top_dir
    • proj1
      • Quelle/
      • Behälter/
      • Skripte/
      • eineDatei.txt
    • proj2
      • Quelle/
      • Behälter/
      • Ziel
        • Behälter/
      • datei.xml

Ich möchte per rsync nur die Bin-Verzeichnisse direkt unter den Projektverzeichnissen (also top_dir/proj2/target/bin/ ignorieren) und deren Inhalt in das Zielverzeichnis übertragen, sodass es folgendermaßen aussieht:

  • top_dir
    • proj1
      • Behälter
    • proj2
      • Behälter

Ich könnte es wahrscheinlich zum Laufen bringen, indem ich jedes Bin-Verzeichnis (in meinem realen Szenario gibt es ungefähr 15) explizit in einer Include-From-Datei aufliste, aber ich dachte, es muss eine Möglichkeit geben, anzugeben, dass ich alle Verzeichnisse top_dir/*/bin synchronisieren möchte.

Antwort1

Möglichkeit 1

Wenn Sie anstelle der Filterregeln die Shell-Erweiterung 1 verwenden, können Sie Folgendes tun:rsync

a. So schließen Sie alle binVerzeichnisse in die top_dirHierarchie ein:

rsync -av -R top_dir/**/bin/ destination_path

Hier -Rist ein rsync 2 Parameter fürrelativ. man rsyncerklärt es als

Verwenden Sie relative Pfade. Dies bedeutet, dass die vollständigen Pfadnamen, die in der Befehlszeile angegeben wurden, an den Server gesendet werden und nicht nur die letzten Teile der Dateinamen. Dies ist insbesondere dann nützlich, wenn Sie mehrere verschiedene Verzeichnisse gleichzeitig senden möchten.

Im Wesentlichen bedeutet es aber, dass die Verzeichnisstruktur erhalten bleibt.

**ist ein Shell-Globbing-Muster und sucht rekursiv nach Verzeichnissen, die binunter benannt sind top_dir. Im obigen Beispiel wird die Befehlszeile also wie folgt erweitert:

rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path

binb. Wenn Sie nur Verzeichnisse eine Ebene unter dem Projektverzeichnis einschließen möchten , verwenden Sie einfach ein einzelnes *(das funktioniert auch mit „alten“ Shells!):

rsync -av -R top_dir/*/bin/ destination_path

1 Sie benötigen eine aktuelleSchlagVersion (>4) und aktiviere rekursives Globbing über shopts -s globstar. MitzshRekursives Globbing ist Standard.

2 rsync-Version v3.2.3, Protokollversion 31 unter Linux.

Möglichkeit 2

Nur wenn Sie die Filterregeln von rsync verwenden, benötigen Sie:

a. So schließen Sie alle binVerzeichnisse in die top_dirHierarchie ein:

rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path

Die erste includeRegel ist möglicherweise nicht offensichtlich 3 , garantiert aber, dass alle Verzeichnisse (beachten Sie das nachstehende /) durchsucht werden, die zweite fügt alles in binVerzeichnissen hinzu und die excludeRegel schließt alles andere aus. -mstellt sicher, dass leere Verzeichnisse nicht kopiert werden.

b. Um nur eine Ebene unterhalb des Projektverzeichnisses einzuschließen:

rsync -av -m  --include='/*/' --include='/*/bin/***' --exclude='*' top_dir/ destination_path

Verwenden Sie ***die Syntax von rsync >= 2.6.7. Die führenden /in den Mustern stellen dar top_dir, andernfalls werden die Muster mit denEndedes Dateipfades.


3 Suche /some/path/this-file-will-not-be-foundinman rsync

Antwort2

Sie können alle srcVerzeichnisse ausschließen mit--exclude src/

verwandte Informationen