84

構文を正しく理解するのに問題がrsyncあり、シナリオを実際にで処理できるかどうか疑問に思っていますrsync。まず、rsyncローカルホストとリモートホストの間で正常に機能していることを確認しました。ディレクトリで直接同期を実行すると成功します。

私のファイルシステムは次のようになります。

uploads/
  1260000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg
  1270000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg
  1280000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg

私がやりたいのは、サブディレクトリで「file_11_」で始まるファイルに対してのみrsyncを実行することです。また、サブディレクトリ内のこれらすべてのファイルを同期するために1つのrsyncジョブのみを実行できるようにしたいです。

これが私が試しているコマンドです:

rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

これにより、ドライランで0ファイルが転送対象としてマークされます。--includeとステートメントの他のさまざまな組み合わせを試しまし--excludeたが、結果が得られないか、包含または除外オプションが設定されていないかのようにすべてが得られました。

誰かがこれを行う方法を知っていますか?

4

3 に答える 3

135

問題は、--exclude="*"(たとえば)1260000000/ディレクトリを除外するようにrsync指示しているため、そのディレクトリの内容を調べないため、ディレクトリにが一致するファイルが含まれていることに気付かないことです--include

私はあなたが望むものに最も近いものはこれだと思います:

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(これには、すべてのディレクトリ、および一致するすべてのファイルが含まれますfile_11*.jpgが、他のファイルは含まれません)、またはおそらくこれ:

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(同じ概念ですが、含まれるディレクトリについてはかなり注意が必要です)。

于 2012-03-31T01:02:11.677 に答える
60

rsync除外パターンの例を含める:

"*"         means everything
"dir1"      transfers empty directory [dir1]
"dir*"      transfers empty directories like: "dir1", "dir2", "dir3", etc...
"file*"     transfers files whose names start with [file]
"dir**"     transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc...
"dir***"    same as above
"dir1/*"    does nothing
"dir1/**"   does nothing
"dir1/***"  transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc...

そして最後の注意点は、パスを評価するために最初に使用されたアスタリスクに単純に依存しないことです。のように"**dir"(単一のフォルダまたはファイルに使用しても問題ありませんが、パスには使用できません)、ファイル名には3つ以上のアスタリスクが機能しないことに注意してください。

于 2017-12-28T16:03:26.397 に答える
7

これが私の「釣りをするように人に教える」答えです:

Rsyncの構文は間違いなく直感的ではありませんが、理解する価値があります。

  1. まず、を使用-vvvしてrsyncのデバッグ情報を確認します。
$ rsync -nr -vvv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

[sender] hiding directory 1280000000 because of pattern *
[sender] hiding directory 1260000000 because of pattern *
[sender] hiding directory 1270000000 because of pattern *

ここでの重要な概念は、rsyncが各ディレクトリに包含/除外パターンを再帰的に適用することです。最初の包含/除外が一致するとすぐに、処理は停止します。

評価する最初のディレクトリはです/Storage/uploads。dirs/filesStorage/uploadsがあります。1280000000/, 1260000000/, 1270000000/それらのどれもfile_11*.jpg含めるために一致しません。それらはすべて一致*して除外されます。したがって、それらは除外され、rsyncは終了します。

  1. 解決策は、最初にすべてのdir(*/)を含めることです。次に、最初のdirコンポーネントは1260000000/, 1270000000/, 1280000000/、一致するためになります*/。次のdirコンポーネントはになります1260000000/。に一致するので、含まれています1260000000/。などなど。file_11_00.jpg--include="file_11*.jpg"
$ rsync -nrv --include='*/' --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

./
1260000000/
1260000000/file_11_00.jpg
1260000000/file_11_01.jpg
1270000000/
1270000000/file_11_00.jpg
1270000000/file_11_01.jpg
1280000000/
1280000000/file_11_00.jpg
1280000000/file_11_01.jpg

https://download.samba.org/pub/rsync/rsync.1

于 2020-11-24T08:18:23.320 に答える