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
/aaa
aaa
ソースパスの上部に名前が付けられているすべてのファイルまたはディレクトリに適用されます。aaa/
名前付きすべての項目に適用されます。aaa
パスがディレクトリのサブディレクトリbbb/ccc/
を表すようにそれらを結合できます。ccc
bbb
ソースツリーのどこでもしかし、ディレクトリ内の/bbb/ccc/
ディレクトリです。ccc
bbb
ソースツリーの上部にバインド。
包含および除外ジョブは左から右に処理されます(最初のジョブは2番目のジョブよりも重要で、2番目のジョブは3番目のジョブよりも重要です)。
それでは具体的な例を見てみましょう。
rsync -ah --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"
フィルタリングルールは次の順序で表示されます。
foo
名前が次に始まる名前のディレクトリにあるすべてのファイルまたはディレクトリを含めます。data
ソースパスの下のどこかに。- すべての
*.zip
ファイル(またはディレクトリ)を除外します。 - まだ言及していないすべてを除外してください。
最初のインクルードは一致します/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/
。親ディレクトリが含まれていない場合、子ディレクトリも無視されます。
マッチングパターンは左から右に行われます。