rsync:複数のファイル形式を除外する方法は?

rsync:複数のファイル形式を除外する方法は?

これはCatalinaを実行しているMacのbashです。

これは働きます:

rsync -Pa --rsh="ssh -p 19991" --exclude '*.jpg' --exclude '*.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/

rsync -Pa --rsh="ssh -p 19991" --exclude {'*.jpg', '*.mp4'} pi@localhost:/home/pi/webcam /Volumes/Media/Webcam\ Backups/raspcondo/webcam/

出力は次のとおりです。

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]

除外するファイルの種類のリストに問題がありますか?

ベストアンサー1

まず、最初の例は機能します。使用に問題がありますか?

本当にこれをしたくない場合は試してみてください。--exclude=*.{jpg,mp4}一部のシェルでは拡張されますが、--exclude=*.jpg --exclude=*.mp4次の点に注意してください。

  1. これは住宅の特徴と言うサポート拡張。これはいいえrsync または rsync フィルタルールの機能です。

    rsyncが中括弧自体を使用すると誤って考えると、これは簡単に混乱し、「驚くべき」動作につながる可能性があります(中括弧を使用したり、することも、まったく見ることはできません)。

  2. 延長完了今後rsync が実行されます。 rsync は、たとえば次のようにのみ表示できます。 --exclude=*.mp4 なぜなら現在、ディレクトリにはこのパターンと一致するファイル名はありません。

  3. --exclude=*.mp4ファイル名が一致するか、中--exclude=*.jpg括弧拡張はワイルドカードなしで正確なファイル名に拡張されます。

例えば

$ mkdir /tmp/test
$ cd /tmp/test
$ echo rsync --exclude=*.{jpg,mp4}
rsync --exclude=*.jpg --exclude=*.mp4

これまでは大丈夫です...しかし、ファイル名が実際に中かっこ拡張と一致する場合、何が起こるのか見てください。

$ 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

多くの--excludeオプションを入力しないより良い方法は、配列とprintfを使用することです。

excludes=('*.mp4' '*.jpg')
rsync ...args... $([ "${#excludes[@]}" -gt 0 ] && printf -- "--exclude='%s' " "${excludes[@]}") ...more args...

これにより、次のコマンドラインが生成されます。

rsync ...args... --exclude='*.mp4' --exclude='*.jpg'  ...more args...

たとえば、配列とプロセスの置き換えを使用する方が良いです--exclude-from

rsync ... --exclude-from=<([ "${#excludes[@]}" -gt 0 ] && printf -- '- %s\n' "${excludes[@]}") ... 

おすすめ記事