
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
- proj1
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
- proj1
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 bin
Verzeichnisse in die top_dir
Hierarchie ein:
rsync -av -R top_dir/**/bin/ destination_path
Hier -R
ist ein rsync 2 Parameter fürrelativ. man rsync
erklä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 bin
unter 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
bin
b. 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 bin
Verzeichnisse in die top_dir
Hierarchie ein:
rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path
Die erste include
Regel ist möglicherweise nicht offensichtlich 3 , garantiert aber, dass alle Verzeichnisse (beachten Sie das nachstehende /
) durchsucht werden, die zweite fügt alles in bin
Verzeichnissen hinzu und die exclude
Regel schließt alles andere aus. -m
stellt 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-found
inman rsync
Antwort2
Sie können alle src
Verzeichnisse ausschließen mit--exclude src/