/ / Wie kann ich eine Reihe von Unterverzeichnissen synchronisieren? - rsync

Wie kann ich eine Reihe von Unterverzeichnissen synchronisieren? - rsync

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

  • top_dir
    • proj1
      • src /
      • Behälter/
      • Drehbücher /
      • somefile.txt
    • proj2
      • src /
      • Behälter/
      • Ziel
        • Behälter/
      • file.xml

Ich möchte nur die bin-Verzeichnisse direkt unter den Projektverzeichnissen synchronisieren (d. H. Top_dir / proj2 / target / bin / ignorieren) und deren Inhalt in das Zielverzeichnis, so dass es so aussieht:

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

Ich könnte es wahrscheinlich explizit durcharbeiten lassenAuflisten jedes bin-Verzeichnisses (es gibt ungefähr 15 in meinem realen Szenario) in einer Include-from-Datei, aber ich dachte, es muss eine Möglichkeit geben zu sagen, dass ich alle top_dir / * / bin-Verzeichnisse synchronisieren möchte.

Antworten:

15 für Antwort № 1

Möglichkeit 1

Verwenden Sie nicht die Filterregeln von rsync, sondern die Shell-Erweiterung * du kannst tun:

ein. Alle einbeziehen bin dirs in der top_dir Hierarchie:

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

Hier -R ist ein rsync-Parameter, für den steht relativ und bedeutet, dass die Verzeichnisstruktur erhalten bleibt.

** ist ein Shell-Globbing-Muster und sucht rekursiv nach benannten Verzeichnissen bin unter top_dir. Mit dem obigen Beispiel wird die Befehlszeile folgendermaßen erweitert:

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

b. Wenn Sie nur einschließen möchten bin Verwenden Sie eine Ebene unter dem Projektverzeichnis nur eine einzige * (das funktioniert auch mit "alten" Muscheln!):

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

* Du brauchst einen neuen bash version (> 4) und aktiviere rekursives Globbing über shopts -s globstar. Mit zsh Standardmäßig wird rekursives Globbing verwendet.

Möglichkeit 2

Sie benötigen nur die Filterregeln von rsync:

ein. Alle einbeziehen bin dirs in der top_dir Hierarchie:

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

Die erste Einschlussregel ist möglicherweise nicht offensichtlich+, aber garantiert, dass alle Verzeichnisse (beachten Sie die nachstehenden /) gesucht werden, der zweite fügt schließlich alles hinzu bin Verzeichnisse und die Ausschlussregel schließt alles andere aus. -m stellt sicher, dass leere Verzeichnisse nicht kopiert werden.

b. Nur eine Ebene unter dem Projektverzeichnis:

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

Verwenden *** Syntax von rsync> = 2.6.7. Die Führung / in den Mustern darstellen top_dir, andernfalls werden die Muster mit dem verglichen Ende des Dateipfads.


+ Suchen nach /some/path/this-file-will-not-be-found im man rsync


0 für Antwort № 2

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


Verwandte Fragen
Bemerkungen
Einen Kommentar hinzufügen