ファイルシステム階層の異なるレベルで同じ親ディレクトリ名を持つすべてのファイルをサーバーAからサーバーBにコピーしたい、例えば:
/var/lib/data/sub1/sub2/commonname/filetobecopied.foo
/var/lib/data/sub1/sub3/commonname/filetobecopied.foo
/var/lib/data/sub2/sub4/commonname/anotherfiletobecopied.foo
/var/lib/data/sub3/sub4/differentname/fileNOTtobecopied.foo
サーバーBへのパスにcommonname
が含まれる最初の3つのファイルをコピーします。rsync
の正しい包含/除外パターンを見つけるのに多くの時間を既に費やしましたが、わかりません。次のコマンドは機能しません。
rsync -a --include='**/commonname/*.foo' --exclude='*' [email protected]:/var/lib/data /var/lib/data
一致するファイルが多すぎるか、少数です。パスにcommonname
を持つファイルのみを同期するにはどうすればよいですか?
あなたはこれを探していると思います:
rsync -a -m --include='**/commonname/*.foo' --include='*/' --exclude='*' [email protected]:/var/lib/data /var/lib/data
コマンドには2つの違いがあります。
--include='*/'
です。これがないと、--exclude='*'
を指定したように、rsync
はすべてが除外されるため、サブディレクトリには入りません。 --include='*/'
を使用すると、サブディレクトリが除外されなくなるため、rsync
を問題なく再帰できます。-m
です。これは空のディレクトリを削除します。これがないと、(空の)サブディレクトリ/var/lib/data/sub3/sub4/differentname/
もコピーされます。