1. 序章

このチュートリアルでは、Unixシステムで重複ファイルを見つけるいくつかの異なる方法を見ていきます。

2. ファイル構造

まず、例で使用するファイル構造を簡単に見てみましょう。

.
+--baeldung
|  +--folder1
|  |  +--text-file-1
|  |  |  Content: "I am not unique"
|  |  +--text-file-2
|  |  |  Content: "Some random content 1"
|  |  +--unique-file-1
|  |  |  Content: "Some unique content 1\nI am a very long line!"
|  +--folder2
|  |  +--text-file-1
|  |  |  Content: "I am not unique"
|  |  +--text-file-2
|  |  |  Content: "Some random content 2"
|  |  +--unique-file-2
|  |  |  Content: "Some unique content 2! \n I am a short line."
|  +--folder3
|  |  +--text-file-1
|  |  |  Content: "I am not unique"
|  |  +--text-file-2
|  |  |  Content: "Some random content 3"
|  |  +--unique-file-3
|  |  |  Content: "Some unique content 3\nI am an extreme long line............"

baeldungディレクトリがテストディレクトリになります。 内部には、 folder1 folder2、folder3の3つのフォルダーがあります。 それぞれのフォルダには、同じ内容のtext-file-1ファイルと異なる内容のtext-file-2が含まれています。 また、各フォルダには、一意の名前と内容の両方を持つunique-file-xファイルが含まれています。

3. 名前で重複ファイルを検索

重複ファイルを見つける最も一般的な方法は、ファイル名で検索することです。 スクリプトを使用してこれを行うことができます。

awk -F'/' '{
  f = $NF
  a[f] = f in a? a[f] RS $0 : $0
  b[f]++ } 
  END{for(x in b)
        if(b[x]>1)
          printf "Duplicate Filename: %s\n%s\n",x,a[x] }' <(find . -type f)

baeldung ディレクトリで実行すると、一意でない名前のすべてのファイルが一覧表示されます。

Duplicate Filename: textfile1
./folder3/textfile1
./folder2/textfile1
./folder1/textfile1
Duplicate Filename: textfile2
./folder3/textfile2
./folder2/textfile2
./folder1/textfile2

それでは、スクリプトを見て、それが何をするのかを説明しましょう。

  •  <(検索。 –タイプf)– まず、 プロセス置換そのため awk コマンドは、の出力を読み取ることができます探す指図
  • 探す 。 -タイプf 探すコマンドは、内のすべてのファイルを検索します searchPath ディレクトリ
  • awk -F’/’ – awkコマンドのFSとして‘/’を使用します。 ファイル名の抽出が簡単になります。 最後のフィールドはファイル名になります
  • f = $ NF –ファイル名を変数fに保存します
  • a [f] = f in a? a [f] RS $ 0:$ 0 –ファイル名がに存在しない場合連想配列 a [] 、ファイル名をフルパスにマップするエントリを作成します。 それ以外の場合は、新しい行 RS を追加し、フルパスを a[f]に追加します。
  • b [f] ++ –別の配列 b [] を作成して、ファイル名fが見つかった回数を記録します
  • END {for(x in b) –最後に、 ENDブロックで、配列 b[]のすべてのエントリを調べます。
  • if(b [x]> 1) –ファイル名 x が複数回表示された場合、つまり、このファイル名のファイルがさらにある場合
  • printf“ Duplicate Filename:%s \ n %s \ n”、x、a [x] –次に、複製されたファイル名 x を印刷し、すべてのフルパスを印刷しますこのファイル名の場合: a [x]

この例では、重複するファイル名のみを検索していることに注意してください。 次のセクションでは、コンテンツによって重複ファイルを見つけるさまざまな方法を紹介します。

4. MD5チェックサムで重複ファイルを検索

MD5メッセージダイジェストアルゴリズムは、ファイルの内容に基づいて128ビットのハッシュ値を生成する広く使用されているハッシュ関数です。 当初は暗号化ハッシュ関数として使用するように設計されていましたが、データの整合性を検証するためのチェックサムとして今でも広く使用されています。

Linuxでは、 md5sum コマンドを使用して、ファイルのMD5ハッシュを取得できます。

MD5はファイルの内容から生成されるため、重複するファイルを見つけるために使用できます。

awk '{
  md5=$1
  a[md5]=md5 in a ? a[md5] RS $2 : $2
  b[md5]++ } 
  END{for(x in b)
        if(b[x]>1)
          printf "Duplicate Files (MD5:%s):\n%s\n",x,a[x] }' <(find . -type f -exec md5sum {} +)

ご覧のとおり、ファイル名で検索していた前のファイルと非常によく似ています。 ただし、findコマンドに追加された-execmd5sum {} + パラメーターを使用して、すべてのファイルに対してMD5ハッシュを追加で生成します。

テストディレクトリで実行して、出力を確認してみましょう。

Duplicate Files (MD5:1d65953b527afb4bd9bc0986fd0b9547):
./folder3/textfile1
./folder2/textfile1
./folder1/textfile1

ご覧のとおり、 text-file-2、という名前のファイルが3つありますが、それらのコンテンツは一意であるため、MD5ハッシュによる検索には表示されません。

5. サイズで重複ファイルを検索

チェックするファイルが多数ある場合、それぞれのハッシュの計算に時間がかかることがあります。 このような状況では、同じサイズのファイルを見つけることから始めて、それらにハッシュチェックを適用することができます。 これにより、重複するすべてのファイルのファイルサイズが同じになるため、検索が高速化されます。

du コマンドを使用して、ファイルのサイズを計算できます。

同じサイズのファイルを見つけるためのスクリプトを書いてみましょう。

awk '{
  size = $1
  a[size]=size in a ? a[size] RS $2 : $2
  b[size]++ } 
  END{for(x in b)
        if(b[x]>1)
          printf "Duplicate Files By Size: %d Bytes\n%s\n",x,a[x] }' <(find . -type f -exec du -b {} +)

この例では、 -exec du -b {}+パラメーターをfindコマンドに追加して、各ファイルのサイズをawkコマンドに渡します。

baeldung / ディレクトリで実行すると、次の出力が生成されます。

Duplicate Files By Size: 16 Bytes
./folder3/textfile1
./folder2/textfile1
./folder1/textfile1
Duplicate Files By Size: 22 Bytes
./folder3/textfile2
./folder2/textfile2
./folder1/textfile2

test-file-2 はすべて、同じサイズであってもコンテンツが異なるため、これらの結果はコンテンツの重複に関しては正しくありません。

ただし、この入力を使用して、小規模で他の重複チェックを実行できます。

6. fdupesおよびjdupesを使用して重複ファイルを検索する

ファイルサイズやMD5署名のチェックなど、重複ファイルを見つける多くの方法を組み合わせた、すぐに使用できるプログラムがたくさんあります。

人気のあるツールの1つは fdupes。 サイズとMD5署名でファイルを比較することで機能します。 それらが等しい場合は、バイトごとの比較が続きます。

jdupes と見なされます fdupesの強化されたフォーク。 さまざまなデータセットでのテストでは、jdupesは平均してfdupesよりもはるかに高速であるようです。

fdupes を使用して重複ファイルを検索するには、次のように入力します。

fdupes -r .

そして、 jdupes で重複を検索するには:

jdupes -r .

これらのコマンドは両方とも同じ出力になります。

./folder1/text-file-1
./folder2/text-file-1
./folder3/text-file-1

注意— jdupesは最初に派生したfdupesと非常に似ていますが、jdupesはfdupesの互換性のある代替品として開発されていません。

7. 結論

このチュートリアルでは、ファイル名、チェックサム、 fdupes 、および jdupes を使用して、Unixシステムで重複ファイルを見つける方法を学習しました。