【Linux】rsyncで半角英数記号(半角スペース含む)のみのファイル名のみを同期する

rsyncは、ファイル同期を行うLinuxコマンド。 主→従へ完全にファイルの権限やタイムスタンプをコピーする。 デフォルトでは全てのファイルが対象(再帰的なコピーは-rオプションが必要)だが、名前にフィルタリングルールを適応することができる。

rsync -rtv --include='[a-zA-Z0-9!-.:-@[-`{-~]' --exclude='[^ ]' src/ dest/

半角スペース入りを対象外にする場合

rsync -rtv --include='[a-zA-Z0-9!-.:-@[-`{-~]' --exclude='*' src/ dest/

-rtvについて

-rtvは割愛。

–include と –excludeについて

取込対象を指定する --include--exclude は上記のようになんちゃって正規表現が使える。 なんちゃってなので、+など本格的なものはできない。

あとは*でワイルドカードで指定ができる。

--include='*'は、「その名前にマッチするファイル名のみを取り込む」指定ではない

正確には「その名前にマッチするファイルは、後の--include--excludeでのマッチ可否を無視してrsync対象とする」のが正しい。

つまり、--include=*--exclude=*ACLよろしくの先勝ち適応のルールだ。

ひっかけ例1:まず『名前が「contents」であるディレクトリを対象にする』それ以外のものは『デフォルトで対象にする』(除外ルールないので結局全部対象)

rsync --include="contents/" src/ dest/

ひっかけ例2:まず『すべてのパターンを除外する』それ以外のものから『a,b,cいずれかを含むファイルのみを対象とする』(結局全部除外するパターン)

rsync --exclude="*" --include="[abc]" src/ dest/