Dies ist mit Bash auf einem Mac mit Catalina:
Das funktioniert:
rsync -Pa --rsh="ssh -p 19991" --exclude '*.jpg' --exclude '*.mp4' pi@localhost:/home/pi/webcam /Volumes/Media/Webcam\ Backups/raspcondo/webcam/
Dies ist nicht der Fall:
rsync -Pa --rsh="ssh -p 19991" --exclude={'*.jpg', '*.mp4'} pi@localhost:/home/pi/webcam /Volumes/Media/Webcam\ Backups/raspcondo/webcam/
rsync -Pa --rsh="ssh -p 19991" --exclude {'*.jpg', '*.mp4'} pi@localhost:/home/pi/webcam /Volumes/Media/Webcam\ Backups/raspcondo/webcam/
Dies ist die Ausgabe:
building file list ...
rsync: link_stat "/Users/mnewman/*.mp4}" failed: No such file or directory (2)
rsync: link_stat "/Users/mnewman/pi@localhost:/home/pi/webcam" failed: No such file or directory (2)
0 files to consider
sent 29 bytes received 20 bytes 98.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files could not be transferred (code 23) at /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-54.120.1/rsync/main.c(996) [sender=2.6.9]
Was mache ich falsch mit der Liste der auszuschließenden Dateitypen?
Antwort1
Zunächst einmal funktioniert Ihr erstes Beispiel. Was spricht dagegen, es zu verwenden?
Wenn Sie das wirklich nicht möchten, versuchen Sie --exclude=*.{jpg,mp4}
es mit , das (in einigen Shells) zu erweitert wird. --exclude=*.jpg --exclude=*.mp4
Beachten Sie jedoch:
das ist einShell-FunktionangerufenKlammererweiterung. Es istnichteine Funktion von rsync oder den Filterregeln von rsync.
Dies kann leicht zu Verwirrung und „überraschendem“ Verhalten führen, wenn Sie fälschlicherweise glauben, dass rsync die Klammern selbst verwendet (das tut es nicht, kann es nicht und sieht die Klammern nicht einmal).
Der Ausbau ist abgeschlossenVorrsync wird ausgeführt. rsync sieht nur, z. B.
--exclude=*.mp4
WeilEs gibt keinen Dateinamen im aktuellen Verzeichnis, der diesem Muster entspricht.im unwahrscheinlichen Fall, dass es Dateinamen gibt, die mit
--exclude=*.mp4
oder übereinstimmen--exclude=*.jpg
, wird die Klammererweiterung auf genau diese Dateinamen erweitert, ohne Platzhalter.
z.B
$ mkdir /tmp/test
$ cd /tmp/test
$ echo rsync --exclude=*.{jpg,mp4}
rsync --exclude=*.jpg --exclude=*.mp4
so weit, so gut... aber sehen Sie, was passiert, wenn es Dateinamen gibt, die tatsächlich mit den Klammererweiterungen übereinstimmen:
$ touch -- --exclude=foo.jpg
$ touch -- --exclude=bar.mp4
$ touch -- --exclude=foobar.mp4
$ echo rsync --exclude=*.{jpg,mp4}
rsync --exclude=foo.jpg --exclude=bar.mp4 --exclude=foobar.mp4
Um das Eintippen vieler --exclude
Optionen zu vermeiden, können Sie besser ein Array und printf verwenden:
excludes=('*.mp4' '*.jpg')
rsync ...args... $([ "${#excludes[@]}" -gt 0 ] && printf -- "--exclude='%s' " "${excludes[@]}") ...more args...
Das Ergebnis wäre eine Befehlszeile wie die folgende:
rsync ...args... --exclude='*.mp4' --exclude='*.jpg' ...more args...
Noch besser wäre es, ein Array und eine Prozesssubstitution zu verwenden, um eine „Datei“ für bereitzustellen --exclude-from
. zB
rsync ... --exclude-from=<([ "${#excludes[@]}" -gt 0 ] && printf -- '- %s\n' "${excludes[@]}") ...
Antwort2
--exclude={'*.jpg', '*.mp4'}
tut nichtKlammererweiterungweil die öffnende und schließende Klammer in getrennten Wörtern stehen. Die Klammererweiterung bildet aus einem einzigen Wort mit variablem Teil mehrere Wörter. Entfernen Sie das Leerzeichen.
rsync … --exclude={'*.jpg','*.mp4'} …
oder
rsync … --exclude='*.'{jpg,mp4} …
Das =
Nachher --exclude
ist notwendig, da das Ergebnis der Shell-Erweiterung die beiden Wörter --exclude=*.jpg
und sein muss --exclude=*.mp4
. Ohne =
würde die Erweiterung aus drei Wörtern bestehen: --exclude
, *.jpg
und *.mp4
.