
WebDav サーバーからファイルのディレクトリを (再帰的に) ある場所にダウンロードしたいです。ファイルがすでに (どこかに) 存在する場合、再度ダウンロードされることはありません。ただし、フォルダー構造は同じではありません。
簡単な方法はありますか? fdupes を調べましたが、これは重複ファイルの検出と削除のみを目的としています。ファイルは非常に大きいため、オーバーヘッドが大きすぎます。
ターゲットファイルシステムは重複排除をサポートしていません。(FUSE マウントポイントから) 既存のファイルを上書きしないことはわかっていますcp -n
が、フォルダー構造が同じではありません。そのため、困っています。
答え1
見てからWebDAV で利用可能な Linux クライアント私が個人的に好む方法は次のとおりです。
GVFS または WebDAV ファイルシステム モジュール (davfs2 または fusedav) のいずれかを使用して、リモート WebDAV サーバーのファイルをローカル ファイルシステム パスに「マップ」します。
組み込みのcp
-n
コマンドを、宛先のファイルを「上書きしない」ように指示するオプションとともに実行します。Ubuntu などの特定のシェルは、デフォルトでのバージョンdash
を実行し、この組み込みコマンドはオプションをサポートしない可能性があることに注意してください。最良の結果を得るには、または(バイナリが特定のシステム上のどこにあるかによって異なります)を実行して、 の GNU Coreutils バージョンを実行していることを確認してください。builtin
cp
-n
cp
/bin/cp
/usr/bin/cp
編集: 元の質問を読み間違えました。
あなたがおっしゃっているのは、file1.txt
WebDAVサーバーに2つの異なるパスにファイルが存在し、コンテンツこれら 2 つのファイルはまったく同じです。すでにファイルのコピーが 1 つあるので、帯域幅を無駄にするため、ファイルの 2 つ目または 3 つ目のコピーをダウンロードしたくないですか?
良い、クライアント側から、これは非常に難しいでしょう。その理由は次のとおりです。
見なければなりません何を比較しているのかファイルが一意であるかどうかを判断し、要件/コストその比較をするために。
私想定される(間違って)あなたが比較していたのはパスWebDAV フォルダ構造のルートからの相対パスです。パスの等価性の比較にかかるコストは非常に簡単です。 のような 2 つのパス文字列を見て/dir1/dir2/file1.txt
、文字列が一致するかどうかを確認するだけです。一致する場合は重複です。一致しない場合は重複ではありません。
比較できるもう1つのものはファイルです名前、無視してパスたとえば、次の2つのファイルは重複していると考えられます/dir1/dir2/file1.txt
か/dir3/dir4/file1.txt
?のみに基づいて比較する名前、これらは重複とみなされます。ただし、ユースケースに適した種類のテストを作成するために、重複のさまざまなテストを自由に組み合わせることができます。
比較する上であまり役に立たない他のプロパティとしては、ファイルサイズ、属性(としても知られているメタデータ)、ファイル拡張子などです。これらの情報だけでは、重複を判断する力はあまりありません。なぜなら、ほとんどの場合、別のファイルと同じプロパティを持ちながら内容がまったく異なるファイルを作成することは簡単であり、内容が異なっていてもほとんどの人は 2 つのファイルを重複ファイルとは見なさないからです。
私の意見では、比較できる最も重要なものはファイルですコンテンツ残念ながら、WebDAV クライアントの観点からは、ファイルをダウンロードするまでファイルの内容を知る方法はありません。また、クライアント側では、ファイルの内容はファイル転送中または転送後に変更される可能性があり、その場合、ファイルを再度ダウンロードすると重複比較の結果が変わります。
ファイルの内容を比較する基本的な方法は 2 つあります。バイトごとに、 そしてハッシュバイトごとに重複をチェックするのは最も「保証された」方法ですが、比較する必要があるという制限があります。ファイル全体、これは大量のデータに対しては非常に遅いです。また、重複検出の基本的なアルゴリズムの複雑さは であることも考慮してください。O(n^2)
つまり、重複しているかどうかを判断するには、各ファイルの内容を他のファイルの内容と比較する必要があります。暗号化ハッシュを使用してファイルを比較すると、比較または転送する必要があるデータの量が大幅に削減されますが、欠点は、2つのファイルが実際に一致する可能性が極めて小さいことです。違うしかし、ハッシュは同じです。これはハッシュ衝突と呼ばれます。
しかし、再び、クライアント視点からでは知ることはできない何次のいずれかの場合を除き、ファイルの内容やハッシュさえもわかりません。
- サーバーからファイルをダウンロードする、または
- サーバーにハッシュ値をローカルで計算させ、ハッシュをダウンロードします。
前者の場合、ファイルのダウンロードを避けるために、重複しているかどうかを判断するためにファイルをダウンロードしているので、当然そうすることはできません。避けようとしている帯域幅を無駄にしていることになります。比較を行うためだけに!
後者の場合、何か良いことをしているかもしれません。非常に大きなファイルのSHA1ハッシュはわずか数バイトで、大きなファイルのサイズのほんの一部に過ぎません。すべてのファイルのハッシュをダウンロードしてO(n^2)
、ハッシュダウンロードするファイルを決定します。ただし、これらの比較中にサーバー上のファイル データが変更されると、競合状態の問題が発生するため、同期が重要な場合は、必ず考慮する必要があります。
結論としては、
- もしWebDAVサーバーを完全にソフトウェアで制御できず、その構成を変更できない場合は、同じコピーが既にあるかどうかを判断するのに非常に不運です。ファイルの内容サーバー上の複数のファイルに保存され、ない限りサーバー管理者は既にサーバー上のすべてのファイルに対して何らかのハッシュ ファイルを用意しており、ハッシュ値に頼ることができれば、ある程度の成功が得られる可能性があります。
- もしあなたするWebDAVサーバーを完全にソフトウェアで制御し、できる設定を変更するには、スクリプトまたはプログラム (または既存のものを使用) を記述して、たとえば
.sha1sum
WebDAV サーバーでホストされているすべてのファイルと同じディレクトリに、などの拡張子を持つハッシュ ファイルを作成する必要があります。これにより、ファイルのサイズが数キロバイト以上であると仮定すると、ファイルのサイズに比べて比較的控えめな帯域幅コストで、ハッシュのみをダウンロードして比較できるようになります。