40

サーバー1に次のようなディレクトリ構造があります。

  • データ
    • 会社1
      • unique_folder1
      • other_folder
      • ...
    • 会社2
      • unique_folder1
      • ...
    • ...

サーバー2でこのフォルダー構造を複製したいのですが、unique_folder1のディレクトリ/サブディレクトリのみをコピーします。つまり、結果は次のようになります。

  • データ
    • 会社1
      • unique_folder1
    • 会社2
      • unique_folder1
    • ...

私はこれrsyncが非常に良いことを知っています。「含める/除外する」オプションを試しましたが、成功しませんでした。

たとえば、私は試しました:

rsync -avzn --list-only --include '*/unique_folder1/**' --exclude '*' -e ssh user@server.com:/path/to/old/data/ /path/to/new/data/

しかし、その結果、ファイル/ディレクトリが表示されません:

receiving file list ... done
sent 43 bytes  received 21 bytes  42.67 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

どうしたの?アイデア?


追加情報: 両方のサーバーに sudo アクセスできます。私が持っている1つのアイデアは、findcommandを使用cpioして、必要なコンテンツを含む新しいディレクトリにコピーし、その後使用することRsyncです。しかし、これは非常に遅く、ファイルがたくさんあります。

4

4 に答える 4

39

その理由がわかりました。私に関してはRsync、このように機能するかどうかは明確ではありませんでした。
したがって、正しいコマンド (company1ディレクトリのみ) は次のようになります。

rsync -avzn --list-only --include 'company1/' --include 'company1/unique_folder1/***' --exclude '*' -e ssh user@server.com:/path/to/old/data/ /path/to/new/data

companyつまり、各親ディレクトリを含める必要があります。companyもちろん、コマンドラインでこれらすべてのディレクトリを手動で書き込むことはできないため、リストをファイルに保存して使用します。


最後に行う必要があること:

1.サーバー1でインクルードファイルを生成するため、そのコンテンツは次のようになります(私はlsandを使用しましたawk):

+ company1/  
+ company1/unique_folder1/***  
...  
+ companyN/  
+ companyN/unique_folder1/***  

2. include.txt をサーバー 2 にコピーし、次のコマンドを使用します。

rsync -avzn                                        \
      --list-only                                  \
      --include-from '/path/to/new/include.txt'    \
      --exclude '*'                                \
      -e ssh user@server.com:/path/to/old/data/    \
      /path/to/new/data
于 2013-03-29T10:49:16.483 に答える
3

たとえば、リモート システムtarget/classes/とのみ同期したい場合は、次のようにします。target/lib/

rsync -vaH --delete --delete-excluded --include='classes/***' --include='lib/***' \
      --exclude='*' target/ user@host:/deploy/path/

注目すべき重要事項:

  • /パスの末尾の" " を忘れないでください。そうしないと、サブディレクトリにコピーが作成されます。
  • --include,の順番が--exclude重要です。
  • 他の回答とは対照的に、 " " で始まる/include/exclude パラメータは不要で、ソース ディレクトリに自動的に追加されます (target/例では)。
  • 他の回答が言うように、正確に何が起こるかをテストするには、--dry-runフラグを使用できます。
  • --delete-excluded は、特に含めたサブディレクトリを除いて、ターゲット ディレクトリ内のすべてのコンテンツを削除します。賢く使うべし!このため、 a--deleteでは不十分です。デフォルトではリモート側の除外ファイルは削除されません (1 つおきに、はい)。通常の--delete, とは別に指定する必要があります。
于 2019-04-12T23:02:57.027 に答える