web-dev-qa-db-ja.com

ディレクトリ構造をそのままにして、パスに一致するパターンを持つファイルを再同期する方法は?

ファイルシステム階層の異なるレベルで同じ親ディレクトリ名を持つすべてのファイルをサーバー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を持つファイルのみを同期するにはどうすればよいですか?

19
murks

あなたはこれを探していると思います:

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/もコピーされます。
35
gniourf_gniourf