rsync: Wie schließe ich mehrere Dateitypen aus?

rsync: Wie schließe ich mehrere Dateitypen aus?

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=*.mp4Beachten Sie jedoch:

  1. 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).

  2. 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.

  3. im unwahrscheinlichen Fall, dass es Dateinamen gibt, die mit --exclude=*.mp4oder ü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 --excludeOptionen 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 --excludeist notwendig, da das Ergebnis der Shell-Erweiterung die beiden Wörter --exclude=*.jpgund sein muss --exclude=*.mp4. Ohne =würde die Erweiterung aus drei Wörtern bestehen: --exclude, *.jpgund *.mp4.

verwandte Informationen