2019/08/09

rsyncで除外指定(--exclude)の問題が解決した

dynabook SS SX/15AにNetBSD/i386を入れて利用しています。この他に、日常的に使用しているデスクトップPCがあり、それはWindow10です。Windowsのフォルダ「Documents」にあるファイルをNetBSD側にコピーしておけば、ノートPCを持って出かけた時に参照できて便利だと思うので、同期させておこうと考えています。ただしdynabookのディスク容量が厳しいので、出先では無用なファイルは同期対象から外したいと思っています。

まず同期する仕組みはrsyncを使います。Windows10上のWSLを利用すれば、U*IX系の各種ツールが利用できるため、Win32版rsyncなどを利用するよりも安心できます。rsyncを利用してファイルを同期することは、あまり苦労することもなく出来ました。

やっかいだったのが、除外対象を除いて同期させることです。rsyncで除外対象を指定するにはオプション「--exclude」を指定すればよいようなのですが、指定方法に癖があり、苦労している情報がWebには溢れています。Webで見つけた以下の情報を参考にしました。
  1. rsync の複雑怪奇な exclude と include の適用手順を理解しよう 

最終的に期待する動作をするようになったのですが、うまくいかなかった原因はrsyncのオプションの指定方法ではなく、自作したシェルスクリプトの書き方の問題でした。

当初シェルスクリプトでは次のように書いていました。除外対象は今後増減する可能性がありますし、rsyncに指定するオプションは他にもあるので、それを分離したつもりでした。
EXC_OPTS="   
                    --exclude='*.[eE][xX][eE]'
                    --exclude='*.[jJ][pP][gG]'
"
しかし期待した動作をしない原因は、この指定にあったようです。以下の書き方をすると、期待した動作をするようになりました。違いは、オプションの中でシングルクォートで括っているのを止めたことです。
EXC_OPTS="
                    --exclude=*.[eE][xX][eE]
                    --exclude=*.[jJ][pP][gG]
"
 この解決に至る過程で、rsyncのオプション「-vvv」を利用しました。文字「v」を増やすほど情報が増えるようです。そこに以下のような出力が現れているのが確認できます。除外対象が期待した通りに処理されていれば、このような出力になるはずです。うまく指定されていなければ、「because of pattern」という表示がなく、除外対象にしている筈なのに、なぜか同期対象とされてしまい、頭を捻ることになります。
[sender] hiding file a/b/c/1.jpg because of pattern *.[jJ][pP][gG]
問題の原因がわかってしまえば、至極当然なことと思えますが、解決できていないときには、五里霧中という気持ちになります。ともかく解決できて、一安心しました。

0 件のコメント:

コメントを投稿