【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=...-exclude=... の指定順で処理していき、最初にマッチした条件のみが適応。

例:「src/java」と「src/resources」と「src/pom.xml」だけをコピー対象として、他は除外する

rsync --include="java/" --include="resources/" --include="pom.xml" --exclude=* src/ dest/

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

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

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

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