web-dev-qa-db-ja.com

ハッシュ値でファイルを検索する方法はありますか?

ファイルを検索するときに入力としてハッシュ値を持ち、出力としてファイルとその場所の完全なリストを持つことができる方法はありますか?

これは、ファイルの重複を特定しようとするときに役立つ場合があります。すでにどこかに保存していることがわかっているが、どこにあるのかわからないファイルがたくさんある状況に陥ることがよくあります。それらは本質的に重複しています。

たとえば、ポータブルハードドライブに大量のファイルを保存したり、デスクトップコンピュータの内蔵ハードドライブにそれらのファイルのハードコピーを保存したりできます...しかし、場所がわかりません。ファイルの名前が変更されていない場合は、ファイル名検索を実行して、デスクトップ上のハードコピーを見つけようとすることができます。次に、それらを並べて比較し、同じ場合は、ポータブルハードドライブにあるコピーを削除できます。ただし、ハードドライブのいずれかでファイルの名前が変更されている場合、これはおそらく機能しません(新しい名前が元の名前とどの程度異なるかによって異なります)。

ファイルの名前が変更されたが編集されていない場合、そのハッシュ値を計算できます。 SHA1の値は74e7432df4a66f246b5214d60b190b67e2f6ce52。次に、ファイルを検索するときにこの値を入力として使用し、オペレーティングシステムで、指定されたディレクトリまたはファイルシステム全体で、この正確なSHA1ハッシュ値を持つファイルを検索し、これらのファイルが保存されている場所の完全なリストを出力します。

私はWindowsを使用していますが、オペレーティングシステムに関係なく、このようなことをどのように実現できるかを知りたいと思っています。

2
Samir

Linuxの例:

_echo '74e7432df4a66f246b5214d60b190b67e2f6ce52' | { read hash ; find -type f -exec sh -c 'sha1sum "$1" | cut -f 1 -d " " | sed "s|^\\\\||" | grep -Eqi "$0"' "$hash" "{}" \; -print ; }
_

このコードは、次の理由により、思ったよりも複雑です。

  • スペース、改行、円記号、引用符、特殊文字などを含むファイル名を正しく処理することを目的としています(さらに解析するには、_-print_を_-print0_に変更してください)。
  • ハッシュを正規表現として受け入れることを目的としています(_grep -E_、つまりegrepと互換性があります)、
    例えば。 '(^00)|(00$)'は、ファイルハッシュが_00_で開始または終了する場合に一致します。

互換性のあるインターフェースを備えた他の_*sum_ツールを使用できます(例:_md5sum_)。

2

これは興味深い質問です。私はfdupesと呼ばれるツールを使用して同様のことを達成しています。 Fdupesはディレクトリを再帰的に検索し、すべてのファイルを他のすべてのファイルと比較します。最初にサイズを比較し、サイズが同じである場合はファイルのハッシュを作成して比較します。ハッシュが同じである場合は、実際に各ファイルをバイトごとに調べて比較します。

本当に同一のファイルがすべて見つかったら、いくつかのことを実行させることができます。重複ファイルを削除して、その場所にハードリンクを作成します(したがって、HDDスペースを節約します)が、重複ファイルの場所を出力するだけで、何もしません。これはあなたが求めているシナリオです。

Fdupesのいくつかの欠点は、私が知る限り、Linuxのみであり、すべてのファイルを他のすべてのファイルと比較するため、実行にかなりのI/Oと時間がかかることです。言うまでもなくファイルを「検索」するわけではありませんが、同じハッシュを持つすべてのファイルを一覧表示します。

私はそれを強くお勧めし、データの不要な重複がないように、毎日cronジョブで実行するように設定しました(もちろんバックアップは除外されます)。

Fdupesソースページ

1
tbenz9

私はすでに持っている簡単なツールを使用するのが好きなので、Windows PowerShellでそれを行う方法を次に示します(明らかにWindowsでのみ機能します)。これは実際にはAlexKの回答を少し編集したものですが、問題はハッシュを使用して検索する方法でしたが、彼の回答は特定のファイルのコピーを検索していました。

Get-ChildItem "_search_location_" -Recurse | Get-FileHash | Where-Object hash -eq _hash_here_ | Select path

_search_location_を検索するディレクトリに置き換え、_hash_here_を検索するファイルのハッシュに置き換えるだけです。

1
user746340

PowerShell v.4.0以降を使用している場合は、次のコマンドを使用できます。

Get-ChildItem _search_location_ -Recurse | Get-FileHash | 
Where-Object hash -eq (Get-FileHash _search_file_).hash | Select path

ここで、_search_location_は重複を検索するフォルダーまたはディスクであり、_search_file_はどこかに重複があるファイルです。このコマンドをループに入れて複数のファイルを検索したり、行の最後に| Remove-Itemを追加して、重複を自動的に削除したりできます。

また、このコマンドは小さな検索フォルダにのみ適していることに注意してください。検索場所に数千のファイル(HDD全体など)がある場合は、時間がかかります。

1
Alex K

FileLocator Pro というツール($)があり、ファイルハッシュ(SHA-xまたはMD5)で検索できます。

このページからの抜粋: http://www.mythicsoft.com/filelocatorpro/help/en/advanced_criteria.htm

注:式のタイプが「ファイルハッシュ」に設定されている場合、含まれるテキストボックスには、コンマで区切られたハッシュ値のリスト、またはハッシュ値のリストを含むファイルへのポインターを含めることができます。

5A9C9B42A16F5E1985B7B0A019114C7A、675C9B42A16F5E1985B7B0A019114C7A

または、

= c:\ FileHashTable.txt

ハッシュの計算に使用される実際のアルゴリズム。 SHA1、MD5は、[オプション]タブで指定されます。

0
snowdude

MD5アルゴリズムの例を次に示します。

Get-ChildItem "_search_location_" -Recurse | Get-FileHash -Algorithm MD5 | Where-Object hash -eq _hash_here_ | Select path

_search_location_を検索するディレクトリに置き換え、_hash_here_を検索するファイルのハッシュに置き換えます。

Sha256ハッシュ以外のハッシュを検索する場合は、-Algorithm _algorithm_の後にGet-FileHashを追加します。ここで、_algorithm_は選択されたアルゴリズムです。

これにはPowerShell4.0が必要であり、検索ごとにすべてのファイルのすべてのハッシュが再計算されることに注意してください。

0
user746347