このプロジェクトについて
findDupesはGoで記述されたコマンドラインユーティリティであり、ファイル名ではなくコンテンツハッシュによって重複ファイルを特定するため、異なる名前のコピーであっても検出可能です。1つ以上のディレクトリを検索し、並行してハッシュ計算を行います。
スキャンは、すべてのファイルを完全に読み込むことを避けるため、段階的に進行します。まず、指定されたルートを再帰的にウォークし、各通常ファイルのパスとサイズを収集します。検出されたファイルの中でサイズがユニークなものは、同一のコピーを持つ可能性がないため除外されます。残った候補はワーカープールによって最初の4 KiBがハッシュ化され、そのプレフィックスハッシュが一致したファイルのみが再度読み込まれ、SHA-256で完全にハッシュ化されます。完全なハッシュが同じファイルが重複として報告されます。サイズチェックとプレフィックスチェックは純粋にフィルターとして機能するため、サイズやプレフィックスハッシュが異なるファイル同士が完全にハッシュ化されることはありません。
ルートの処理は慎重に行われます。ルートはスキャン前に絶対パスに変換され、シンボリックリンクが解決されます。重複または重複するルート(同じディレクトリが2回指定された場合や、ディレクトリとそのサブディレクトリが指定された場合など)は、表記が異なる場合や同じシンボリックリンクを介して解決される場合も含めて重複排除されます。スキャン対象ディレクトリ内で遭遇したシンボリックリンクは追跡されず、通常ファイルのみが収集され、同じハードリンクファイルへの複数のパスは1回だけ収集されます。ハッシュ化中に読み込めなかったファイルはログに記録されスキップされます。ルートの解決またはウォークができなかった場合でも、他のルートで見つかったファイルは処理されますが、結果を出力した後にコマンドはエラーを返します。Ctrl-CおよびSIGTERMはアクティブなスキャンをキャンセルし、ファイルシステムの読み取り間で処理が停止します。
重複グループは、SHA-256ハッシュ、ファイルサイズ、およびパスと共に表示されます。再現可能な出力にするため、各グループ内のパスおよびグループ自体がソートされます。フラグには、スキャン中の進捗を表示する-v/--verbose、並行ハッシュ化ワーカー数を指定する-w/--workers(デフォルトはCPU数)、ハッシュ・サイズ・パスフィールドを持つ改行区切りJSONオブジェクトを出力する--json、標準エラー出力にスキャン統計を表示する--stats、および--versionがあります。統計には、検出されたファイル数、サイズフィルタリングされたファイル数、コンテンツハッシュ候補数、重複グループ数、および重複ファイル数が含まれます。これらを標準エラー出力に書き出すことで、JSON出力をjqなどのツールに安全にパイプできます。
インストールにはGo 1.25以降が必要であり、go install github.com/mojotx/findDupes@latestを実行するか、リポジトリをクローンしてgo install -v ./...を実行することで行えます。リポジトリにはCIおよびCodeQLワークフローが含まれており、テストマトリクスではgo.modで宣言されたGoバージョンを使用して、Linux、macOS、Windowsでレース検出を有効にしたスイートを実行します。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.