ダウンロードが間違いではないことを確認する


3

WebDavサーバーから特定の場所にファイルのディレクトリを(再帰的に)ダウンロードしたい。ファイルがすでに存在している場合(どこかに)、再度ダウンロードされることはありません。ただし、フォルダ構造は同じではありません。

それをする簡単な方法はありますか?私はfdupesを調べましたが、それはただdupeの検出と削除のためのものです。ファイルは非常に大きく、オーバーヘッドは非常に大きくなります。

ターゲットファイルシステムは重複排除をサポートしていません。知っている cp -n (FUSEマウントポイントから)既存のファイルを上書きすることはありませんが、フォルダ構造は同じではありません。だから私はちょっと立ち往生しています。

回答:


3

見てから WebDAVに利用可能なLinuxクライアント 、これを行うための私自身の好ましい方法は次のようになります。

  1. GVFSまたはWebDAVファイルシステムモジュールの1つ(davfs2またはfuseav)を使用して、リモートWebDAVサーバーのファイルをローカルファイルシステムパスに "マップ"します。

  2. 内蔵を使う cp でコマンド -n 宛先のファイルを「上書きしない」ように指示するオプション。次のような特定のシェルに注意してください。 dash Ubuntuでは、 builtin のバージョン cp デフォルトではこのビルトインは -n オプション。最良の結果を得るには、GNU Coreutilsバージョンのを実行していることを確認してください。 cp 実行して /bin/cp または /usr/bin/cp (バイナリがあなたの特定のシステムのどこにあるかによります)。

編集:あなたの最初の質問を誤解しました。

私はあなたが言っているのはあなたがファイルの状況があるということだと思います file1.txt WebDAVサーバーの2つの異なるパスに存在する 内容 これら2つのファイルのまったく同じです。そして、あなたはすでにファイルのコピーを1つ持っているので、帯域幅を浪費するので、あなたはファイルの2番目または3番目のコピーをダウンロードしたくありませんか?

まあ、 クライアント側から 、これは非常に難しいでしょう。これが理由です。

あなたは見なければなりません 比較しているもの ファイルが一意かどうかを判断し、 要件/コスト その比較をするために。

想定された あなたが比較していたのは パス WebDAVフォルダ構造のルートに対する相対パス。パスの等価性比較を行うコストは非常に簡単です。次のように、2つのパス文字列を見るだけです。 /dir1/dir2/file1.txt文字列が一致するかどうかを確認します。もしそうなら、それは重複しています。そうでなければ、そうではありません。

もう一つ比較できるのはファイルです。 無視して パス 。したがって、たとえば、これら2つのファイルが重複しているとします。 /dir1/dir2/file1.txt そして /dir3/dir4/file1.txt?まあ、あなたがいるなら のみ に基づいて比較する それから、これらは重複していると見なされます。ただし、ユースケースに適した種類のテストを作成するために、さまざまなテストを自由に組み合わせて組み合わせることができます。

比較するのに便利ではないその他の特性 ファイルサイズ 属性 (としても知られている メタデータ ほとんどの場合、他のファイルと同じプロパティを持つが完全に異なる内容を持つファイルを作成するのは簡単なので内容が異なる場合、ほとんどの人は2つのファイルが重複しているとは考えません。

私の意見では、あなたが比較できる最も重要なことはファイルです。 内容 。残念ながら、WebDAVクライアントの観点からは、ファイルを既にダウンロードしていない限り、ファイルの内容を知る方法はありません。クライアントに関しては、ファイル転送中または転送後にファイルの内容が変わる可能性があります。その場合は、ファイルを再ダウンロードすると重複比較の結果が変わります。

ファイルの内容を比較する基本的な方法は2つあります。 バイトごと 、そして ハッシング 。バイトのバイトは重複をチェックするための最も「保証された」方法ですが、それはあなたが比較しなければならないという制限に苦しみます ファイル全体 これは大量のデータに対しては非常に遅いです。重複検出の基本的なアルゴリズムの複雑さは、 O(n^2)つまり、重複しているかどうかを判断するには、各ファイルの内容を他のファイルの内容と比較する必要があります。暗号ハッシュを使用してファイルを比較すると、比較または転送する必要があるデータ量を大幅に減らすことができますが、欠点は、2つのファイルが実際には存在する可能性が非常に小さいことです。 違う しかし、同じハッシュを持っています - ハッシュ衝突として知られています。

しかし、再び クライアント 見通し、それを知ることは不可能です あなたが以下のいずれかをしていなければ、ファイルの内容は、あるいはそのハッシュです。

  • サーバーからファイルをダウンロードしてください。または
  • ローカルであなたに代わってハッシュ値を計算し、それからハッシュをダウンロードするようにサーバーを説得してください。

前者の場合は、ファイルをダウンロードしないようにするためにファイルが重複しているかどうかを判断するためにファイルをダウンロードしているため、明らかにできません。 比較を実行するためだけに

後者の場合、あなたは何かを続けているかもしれません。非常に大きなファイルのSHA1ハッシュは、ほんの数バイトであり、大きなファイルのサイズのごく一部を表しています。すべてのファイルのハッシュをダウンロードして実行するのはかなり実用的です。 O(n^2) の比較 ハッシュ ダウンロードするファイルを決定します。ただし、これらの比較を行っている間にサーバー上でファイルデータが変更された場合でも競合状態の問題が発生します。そのため、重要な場合は必ず同期を考慮に入れる必要があります。

だから、結論:

  • IF あなたはWebDAVサーバを完全にソフトウェアで制御することができず、その設定を変更することができません。あなたはすでに同じもののコピーを持っているかどうかを判断することで大いに不運です。 ファイル内容 サーバー上の複数のファイルに格納されている ない限り サーバー管理者は、サーバー上のすべてのファイルに対してある種のハッシュファイルをすでに利用可能にしています。ハッシュ値に頼ることができれば、ある程度の成功を収められるかもしれません。
  • IF 君は 行う WebDAVサーバーを完全にソフトウェア制御している 有能 その設定を変更するには、スクリプトやプログラムを書く(あるいは既に利用可能なものを使う)などの拡張子を持つハッシュファイルを作成したいかもしれません。 .sha1sum WebDAVサーバーによってホストされるすべてのファイルと同じディレクトリにあります。ファイルのサイズが数キロバイトを超えると仮定すると、これにより、ハッシュのみをダウンロードして比較することができます。ファイルのサイズと比較すると比較的わずかな帯域幅のコストです。

ファイルがに存在しないことを意味します どれか サブフォルダー、またはその場所の他の場所
wishi

1
ああ。ファイルはパス/dir1/dir2/file1.txtおよび/dir3/dir4/file1.txtに存在し、2つのファイルはお互いのコピーです。これは問題になります。 :S
allquixotic

その答えてくれてありがとう。ハッシュサムとリストを使用したアプローチが有効な方法です。いくつかのPythonで。いくつかのawk / sed / cp / md5sumマジックを含む、よく知られている独創的なトリックがあるかどうかわかりませんでした:)そして、通常私が知っている最後の人です。
wishi

1
ねえ、あなたがPythonで一般的に有用な何かを開発することに成功したならば、あなたはgithubなどにあなたのコードを公開し、あなたが学んだことを提供する私の答え(そして/またはあなたの質問)を編集するべきです:)同じ問題があります。
allquixotic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.