2016-06-30 6 views
1

Problem: Aufruf von rsync von einem Zsh-Skript, ich möchte rsync, um Dateien mit einem bestimmten Satz von Erweiterungen auszuschließen. So wie ich das jetzt mache ist:Ausschließen von Dateien mit einem bestimmten Satz von Erweiterungen von Rsync kopiert werden

rsync -r --exclude '*.bak' --exclude '*.save' --exclude '*.backup' --exclude '*.old' ... from_directory/* to_directory 

Diese mühsam zu schreiben und die Befehlszeile ziemlich lange erhalten. Ich habe versucht, als Alternative

# THIS DOES NOT WORK: 
rsync -r --exclude '*.bak' --exclude '*.{save,backup,old,...}' from_directory/* to_directory 

aber das funktioniert nicht - rsync nicht die Abkürzung mit geschweiften Klammern behandeln (was nicht wirklich überraschend ist, denn auch auf dem Shell-Ebene, ist dies nicht Teil der Datei Globbing , aber tritt in einem früheren Stadium der Interpretation der Befehlszeile auf).

Ich überlegte auch, alle Muster in eine Datei zu schreiben und --exclude-list statt --exclude zu verwenden. Das würde funktionieren, aber ich mag diese Lösung nicht, weil ich wollte, dass mein Skript in sich abgeschlossen ist, d. H. Das Dateimuster ist im Skript sichtbar, nicht in einer separaten Datei.

Natürlich gibt es immer die Lösung, die eine temporäre Datei, enthält die Erweiterungen zu erstellen, unter Verwendung eines HIER Dokument:

cat <<<LIST >excluded.txt 
*.bak 
*.save 
... etc 
LIST 
rsync -r --exclude-list excluded.txt .... 
rm excluded.txt 

aber ich frage mich, ob es eine elegantere Lösung ist, entweder durch eine geschickte Nutzung von rsync-Optionen oder durch eine Zsh-Funktion, die die Handhabung der temporären Datei erleichtert.

Antwort

2

Die von Ihnen versuchte Alternative funktioniert nicht, da die Klammererweiterung (foo{a,b,c}barfooabar foobbar foocbar) nicht für in Anführungszeichen gesetzte Klammern ausgeführt wird.

Versuchen Sie stattdessen Folgendes.

rsync -r --exclude='*'.{bak,save,backup,old} from_directory/* to_directory 

Der Trick ist nur * und nutzen die Tatsache, zu zitieren, dass die Werte für die --exclude Option kann auch mit einem = statt ein Leerzeichen getrennt werden. Auf diese Weise zsh erkennt es als ein Wort und

--exclude='*'.{bak,save,backup,old} 

wird

--exclude='*'.bak --exclude='*'.save --exclude='*'.backup --exclude='*'.old 
erweitert werden
Verwandte Themen