
ファイルを検索するときにハッシュ値を入力として取得し、ファイルの完全なリストとその場所を出力する方法はありますか?
これは、ファイルの重複を特定しようとするときに役立ちます。すでにどこかに保存されていることはわかっているものの、どこに保存されているかわからないファイルがたくさんある状況に陥ることがよくあります。それらは基本的に重複しています。
たとえば、ポータブル ハード ドライブにたくさんのファイルがあり、デスクトップ コンピューターの内蔵ハード ドライブにもそれらのファイルのハード コピーがあるかもしれませんが、その場所がわかりません。ファイルの名前が変更されていない場合は、ファイル名検索を実行してデスクトップ上のハード コピーを見つけることができます。次に、それらを並べて比較し、同じ場合はポータブル ハード ドライブにあるコピーを削除できます。ただし、いずれかのハード ドライブでファイルの名前が変更されている場合は、おそらくこの方法は機能しません (新しい名前が元の名前とどの程度異なるかによって異なります)。
ファイルの名前が変更されたが編集されていない場合は、そのハッシュ値を計算できます。たとえば、SHA1 値は です74e7432df4a66f246b5214d60b190b67e2f6ce52
。次に、ファイルを検索するときにこの値を入力として使用し、オペレーティング システムが特定のディレクトリまたはファイル システム全体でこの正確な SHA1 ハッシュ値を持つファイルを検索し、これらのファイルが保存されている場所の完全なリストを出力できるようにします。
私は Windows を使用していますが、オペレーティング システムに関係なく、このようなことを実現する方法を知ることに興味があります。
答え1
Linux の例:
hash='74e7432df4a66f246b5214d60b190b67e2f6ce52'
find . -type f -exec sh -c '
sha1sum "$2" | cut -f 1 -d " " | sed "s|^\\\\||" | grep -Eqi "$1"
' find-sh "$hash" {} \; -print
このコードは、次の理由により、想像以上に複雑です。
- スペース、改行、バックスラッシュ、引用符、特殊文字などを含むファイル名を正しく処理することを目的としています (さらに解析するに
-print
は に変更します)。-print0
- これはハッシュを正規表現として受け入れることを目的としています (つまり と互換性があります
grep -E
)egrep
。
たとえば、'^00|00$'
ファイル ハッシュが で始まるか で終わる場合に一致します00
。より実用的な例は、一度に複数のハッシュで検索することです:'74…|a9…|…|…|…'
(簡潔にするために省略記号を使用し、完全なハッシュを使用します)。
*sum
互換性のあるインターフェースを持つ他のツール (例 ) を使用することもできますmd5sum
。
答え2
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 全体など)、かなりの時間がかかります。
答え3
これは興味深い質問です。私は似たようなことを実現するために fdupes というツールを使っています。fdupes はディレクトリを再帰的に検索し、すべてのファイルを他のすべてのファイルと比較します。まずサイズを比較し、サイズが同じであればファイルのハッシュを作成して比較します。ハッシュが同じであれば、実際に各ファイルをバイトごとに調べて比較します。
完全に同一のファイルをすべて見つけたら、いくつかの処理を実行できます。重複を削除して、その場所にハードリンクを作成します (HDD スペースを節約するため)。ただし、重複ファイルの場所を単に出力して、何もしないようにすることもできます。これが、あなたが尋ねているシナリオです。
fdupes の欠点としては、私が知る限り Linux のみで動作し、すべてのファイルを他のすべてのファイルと比較するため、実行にかなりの I/O と時間がかかることが挙げられます。これは、ファイルを「検索」するわけではありませんが、同一のハッシュを持つすべてのファイルをリストします。
私はこれを強くお勧めします。また、不要なデータの重複がないように、毎日 cron ジョブで実行するように設定しています (もちろん、バックアップは除きます)。
答え4
Voidtools Everything 1.5 (アルファ版)Windows 用の検索ツールには、各ファイルに CRC-32、CRC-64、MD5、SHA-1、SHA-256 などのさまざまなハッシュの列を追加するオプションがあります。