web-dev-qa-db-ja.com

Rsyncのincludeおよびexcludeオプションを使用して、パターンごとにディレクトリとファイルを含める

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ステートメントの他のさまざまな組み合わせを試しましたが、結果が得られないか、またはincludeオプションまたはexcludeオプションが設定されていないかのようにすべてを取得しました。

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

58
Sheldon Chang

問題は、--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/

(同じコンセプトですが、含まれるディレクトリについてはかなり選り好みします)。

102
ruakh

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"(パスではなく単一のフォルダまたはファイルに使用しても構いません)、ファイル名には2つ以上のアスタリスクが機能しないことに注意してください。

19
AmirHossein

空のディレクトリを削除するには、上記の推奨される回答に-mを追加します。

8
brandon