パターンマッチングを使用するrsync固有のサブディレクトリ

パターンマッチングを使用するrsync固有のサブディレクトリ

rsyncを使用して特定のサブディレクトリセットをコピーしてバックアップしようとしています。私のディレクトリ構造は次のとおりです。

/path/to/data/foo1
/path/to/data/foo2
/path/to/data/bar1
/path/to/data/bar2

「bar」フォルダは無視して「foo」フォルダだけをコピーしたいと思います。

また、このフォルダ内のすべての.zipファイルを無視したいと思います。

rsyncでさまざまなパラメータの組み合わせを試しましたが、目的の方法で正しく機能させることはできません。

転送を実行するには、2 つのコマンドを使用できます。

rsync --dry-run -a --human-readable --stats --progress --exclude"*.zip" "/path/to/data/foo1" "/mnt/backup/drive/"
rsync --dry-run -a --human-readable --stats --progress --exclude"*.zip" "/path/to/data/foo2" "/mnt/backup/drive"

他の場所を読んで、これがうまくいくことを願っていました。

rsync --dry-run -a --human-readable --stats --progress --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"

しかし、これは「bar」フォルダもキャプチャしているようです。

--include および --exclude パラメータの順序が混乱しています。 --includeパラメータに "data"フォルダを指定する必要があるため、これは私が期待した機能ではありません。

私が逃している本当に隠すことができない信号です!

ご意見ありがとうございます。

答え1

次の方法でrsyncを実行できます。

rsync --dry-run -av --human-readable --stats --progress --exclude="*.zip" /path/to/data/foo* /path/to/copy/to/

おそらく、次のようにコマンドを短くしたいと思うかもしれません。

rsync  -avhn --stats --progress --exclude="*.zip" /path/to/data/foo* /path/to/copy/to/

から引用人の同期

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)

-v, --verbose               increase verbosity

-h, --human-readable        output numbers in a human-readable format

-n, --dry-run               perform a trial run with no changes made

コマンドを実行する準備ができたら、以下を行う必要はありません。-n

このパラメータを使用してログファイルを保存することもできます。

--log-file=

したがって、上記のrsyncコマンドは次のようになります。

rsync  -avhn --stats --progress --exclude="*.zip" --log-file=logfile.log /path/to/data/foo* /path/to/copy/to/

ログファイルは、コマンドが実行されたディレクトリに書き込まれます。別の場所に保存する必要がある場合は、絶対パスを使用する必要があります。たとえば、

--log-file=/path/to/logfile

答え2

あなたはすでに適切な答えを持っています。いいですね。あなたの質問の他の部分を解決したいと思います。これがまさにこの--include機能があなたが期待どおりに機能しない理由です。

まず、合計フィルタがどのように--include機能するかを見てみましょう。--exclude

  • aaa名前付きすべての項目に適用されます。aaa
  • /aaaaaaソースパスの上部に名前が付けられているすべてのファイルまたはディレクトリに適用されます。
  • aaa/名前付きすべての項目に適用されます。aaa

パスがディレクトリのサブディレクトリbbb/ccc/を表すようにそれらを結合できます。cccbbb ソースツリーのどこでもしかし、ディレクトリ内の/bbb/ccc/ディレクトリです。cccbbbソースツリーの上部にバインド

包含および除外ジョブは左から右に処理されます(最初のジョブは2番目のジョブよりも重要で、2番目のジョブは3番目のジョブよりも重要です)。

それでは具体的な例を見てみましょう。

rsync -ah --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"

フィルタリングルールは次の順序で表示されます。

  1. foo名前が次に始まる名前のディレクトリにあるすべてのファイルまたはディレクトリを含めます。data ソースパスの下のどこかに
  2. すべての*.zipファイル(またはディレクトリ)を除外します。
  3. まだ言及していないすべてを除外してください。

最初のインクルードは一致します/path/to/data/data/foo1が一致しません/path/to/data/foo1。私はこれが重大な誤解だと思います。

/foo*非常に似たソリューションでディレクトリを一致させることができます。

rsync -ah --include="/foo*/" --exclude="*.zip" --exclude="*" "/path/to/data/" "/mnt/backup/drive"

しかし、実際にこの記事を書いている場合は、おそらく/foo*ソースパスの仕様にディレクトリを含め(foo*シェルがワイルドカードを選択できるように引用符で囲まれていない)、不要なzipファイルを除外することを心配します。

rsync -ah --exclude="*.zip" /path/to/data/foo*/ /mnt/backup/drive

答え3

*除外と除外の場合を*/含める前に含める必要がdata/fooありますdata/。親ディレクトリが含まれていない場合、子ディレクトリも無視されます。

マッチングパターンは左から右に行われます。

関連情報