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.