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[@]}") ... 

答え2

--exclude={'*.jpg', '*.mp4'}しないでください支柱の拡張開かれた中かっこと閉じた中かっこが分離されているからです。中括弧拡張は、可変部分を持つ単一の単語から複数の単語を作成します。スペースを削除してください。

rsync … --exclude={'*.jpg','*.mp4'} …

または

rsync … --exclude='*.'{jpg,mp4} …

シェル拡張の結果は2つの単語でなければならない=ため、afterが必要です。それ以外の場合、拡張子は、および3つの単語になります。--exclude--exclude=*.jpg--exclude=*.mp4=--exclude*.jpg*.mp4

関連情報