サブディレクトリのファイルリストをリモートサーバーにrsyncし、関連性のないファイルを削除する

サブディレクトリのファイルリストをリモートサーバーにrsyncし、関連性のないファイルを削除する

私はこの質問に対する答えを見つけることができませんでした。--include、、、--excludeおよびソースディレクトリのさまざまな組み合わせを試しました-r--delete-excluded

これが私が達成したいものです:

  • ソースコードディレクトリ:

    Dir1/File1-1
    Dir1/File1-2
    Dir2/File2-1
    Dir2/File2-2
    Dir2/File2-3
    Dir3/File3-1
    Dir3/File3-2
    Dir3/File3-3
    ...
    
  • ターゲットディレクトリ:(
    ステータス不明)

私が望むのは、ソースディレクトリに事前定義されたファイルサブセットと相対パスを提供し、それをリモートターゲットと同期して、ターゲットからファイルサブセット(ディレクトリを含む)以外のすべてのエントリを削除することです。

たとえば、上記のソースディレクトリは次のとおりです。

  • 私の定義済みファイルのリスト:

    Dir1/File1-2
    Dir3/File3-3
    
  • ターゲットディレクトリ:

    Dir1/File1-1
    Dir1/File1-2
    Dir2/File2-1
    Dir3/File3-1
    

完了すると、ターゲットにDir1 / File1-2、Dir3 / File3-3のみが含まれ、Dir2は含まれません。また、Dir1 / File1-2を再コピーしたくありません。

指示:

  • これは非常に大きなファイルなので、不要なときにリモートで再コピーされるのを防ぐために努力しています。
  • ソースサブディレクトリの内容は毎日変更されます。
  • 事前定義されたリストは毎日変更されますが、昨日のリストのファイルを含めることもできます。
  • ソースディレクトリに0個のファイルがあります。同期に必要なファイルを含むサブディレクトリのみが含まれます。
  • ソースコード内のサブディレクトリはかなり静的です。つまり、Dir1、Dir2、Dir3は常に存在します。

私は私が探している解決策を見つけることができるかどうか努力し続けます。

修正する:

まず感謝したいです。jw013フォーマット変更のため。ヘルプガイドに従いましたが、フォーマットが正しくない理由を理解できません(最初のポスター)。

次のおすすめを使用してください。サージ、次のコマンドを思いついたが、まだファイルリストにないターゲットから不要なファイルを削除できませんでした。

  • 注文する

    rsync -avRP --prune-empty-dirs --delete-delay --ignore-existing $FILE_LIST destination/
    

答え1

以下を使用してこれを実行できます。

rsync -av --delete --update --include-from=LISTFILE   -f 'hide,! */' src/ dst

その中には、LISTFILEターゲットディレクトリに同期する必要があるすべてのファイルを含むファイルがあります。ファイルが変更されていない場合は、を--ignore-existing使用して読み取ることができます--updatersync のマニュアルページもっと学ぶ。

答え2

ファイルがソースにない場合は、rsync でさまざまな削除オプションを使用して、ターゲットからファイルを削除できます。

        --del                   an alias for --delete-during
        --delete                delete extraneous files from dest dirs
        --delete-before         receiver deletes before xfer, not during
        --delete-during         receiver deletes during the transfer
        --delete-delay          find deletions during, delete after
        --delete-after          receiver deletes after transfer, not during

また、以下を--ignore-existing使用してターゲットにあるファイルのコピーをスキップすることもできます。

        --ignore-existing       skip updating files that exist on receiver

空のディレクトリを削除するには、次のものを使用する必要があります。

    -m, --prune-empty-dirs      prune empty directory chains from file-list

だからコマンドは

rsync -av --prune-empty-dirs --delete-delay --ignore-existing src/ dst

私はあなたが探していることを行うと思います

答え3

私はあなたが注意を払う必要があると思います--delete-excluded。ローカルで試してみましたが、必要に応じて機能しているようです。最初に頑張ります

rsync -a --delete-excluded --include-from=LISTFILE --exclude="*" src/ dst

なぜ特定の他のオプションが提案されているのか分かりません。 P. 最も「興味深い」事はです--ignore-existing。より使い慣れた最適化を最初に理解することをお勧めし-aます-u

すでにこれを使っているようです-a。つまり-t、基本的にrsyncを最適化できるという意味です。 「Rsyncは、デフォルトでサイズまたは最後の変更時間が変更されたファイルを検索する「クイックチェック」アルゴリズムを使用して、転送する必要があるファイルを見つけます。そうでない場合は、通常、「または-受信機で最新のファイルをスキップする」を-a使用できます。-u--update

「クイックチェック」最適化で差を測定したい場合障害のある、あなたはそれを使用することができます--checksum。 (破損した場合は、特定の時点ですべての既存のファイルを強制的に再同期したい場合にも役立ちます。有効にすると、どの-vファイルを再作成する必要があるかを確認できます。)

関連情報