日本語マニュアルページはver. 2.5っすか(追記あります)

以下、(おそらく間違いを含む)駄文なので、rsyncのことを知りたい方はこちらへどうぞ

いや、日本語にして下さっているのは大変有難いんです。とはいえ、現状のCentOS5のベースに相当するFC5ぐらいでもすでにver. 2.6なのですが、ver 2.5とは微妙に違ってて、include, excludeをまとめてfilterのオプションに統合可能とかいう辺りが存在しません。
ところで、この--filterのオプション、面白いひねりがあります。
通常、このオプションは、下記のように空白を含む指定が必要です。当然引用符でくくります。

$ rsync --filter='. rule.txt' source_dir destination_dir

ところが、これのオプションでは、空白の部分をアンダースコアで代用できて、引用符も要らなくなります。

$ rsync --filter=._rule.txt source_dir destination_dir

こんな機能がなんで有用なのか、理解し難かったんですが、たまたま、有効な例にぶちあたりました。
ある時、sshを経由してのrsyncによる転送をバッチ処理させようとするとき、expectコマンドでパスワードを渡したくなりました。(大抵はパスワード入力はナシにしよう、という解決法を取るみたいですね:例えば、 http://www2s.biglobe.ne.jp/~nuts/labo/inti/cron-rsync-ssh-nodaemon.html )
expectコマンドは、大抵はファイルにスクリプトを保存して、それを読み込んで動作します。
たとえば、rsyncコマンドを実行しようと思ったらこんな風にしてスクリプトを指定します。

spawn rsync -rsh=ssh --filter='. rule.txt' src user@dest_hostname:/home/dest_user/dest_dir
expect "word"
send "password\n"

ところが、最初のところで、空白を含む引数を与えると、rsyncには正しくその引数が与えられないのです。
文字通り、引数は空白で区切られてしまって、rsyncには '-rsh=ssh'と '--filter=.'と 'rule.txt'と、、いった調子の引数が渡されてしまいます。
なんでこんなことが起こるかといえば、通常のコマンドは、Linux(unix)ではシェル(bashとかcshとかzshとか)が解釈して、それを各コマンドに与えているのですが、expectでは、解釈の方法がこれらのシェルとことなり、機械的に空白で区切られた文字列を引数としてプログラム(この場合はrsync)に与えることになります。
というわけで、expectでは、その中で起動するコマンドに対しては、たとえ引用符で括ったとしても、空白を含む文字列を引数として与えることができないようなのです。(できるようになるオプションとかがあるのかもしれませんけど(汗)
で、 --filter オプションの不思議な機能のおかげで、めでたく私はexpectからrsyncを起動することができるようになったのでした。(実は別にハマるところはあったのですけど)

(2008/6/22追記:実は空白を含むオプションは、ダブルクォート(")でくくれば渡せるようだ。この場合、¥(バックスラッシュ)を前に置いてエスケープする必要はあるが、とにかく可能であるようだ。ただし、別の環境なので、大抵のLinuxでこれが通用するかどうかはまだ確かめていない)