Bashを使用して重複ファイルを削除する方法

Bashを使用して重複ファイルを削除する方法

重複したファイルがあるフォルダmd5summd5Macの場合)があり、検索されたすべてのジョブは削除されるようにスケジュールされています。

しかし、私はこれを行う方法を知りませんでした。私が今まで持っているもの:

md5 -r * | sort

出力は次のとおりです。

04c5d52b7acdfbecd5f3bdd8a39bf8fb gordondam_en-au11915031300_1366x768.jpg
1e88c6899920d2c192897c886e764fc2 fortbourtange_zh-cn9788197909_1366x768.jpg
266ea304b15bf4a5650f95cf385b16de nebraskasupercell_fr-fr11286079811_1366x768.jpg
324735b755c40d332213899fa545c463 grossescheidegg_en-us10868142387_1366x768.jpg
3993028fcea692328e097de50b26f540 Soyuz Spacecraft Rolled Out For Launch of One Year Crew.png
677bcd6006a305f4601bfb27699403b0 lechaustria_zh-cn7190263094_1366x768.jpg
80d03451b88ec29bff7d48f292a25ce6 ontariosunrise_en-ca10284703762_1366x768.jpg
b6d9d24531bc62d2a26244d24624c4b1 manateeday_row10617199289_1366x768.jpg
ca1486dbdb31ef6af83e5a40809ec561 Grueling Coursework.jpg
cdf26393577ac2a61b6ce85d22daed24 Star trails over Mauna Kea.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x768.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x7682.jpg

重複を排除するためにファイルのMD5に基づいて処理する方法は?私は本当に気にしません。どの「オリジナル」はアーカイブしていますが、一つだけアーカイブしたいです。

この問題を別の方法で処理する必要がありますか?

答え1

私はLinuxで作業しています。これは、このコマンドが次のようmd5sumに出力されることを意味します。

> md5sum *
d41d8cd98f00b204e9800998ecf8427e  file_1
d41d8cd98f00b204e9800998ecf8427e  file_10
d41d8cd98f00b204e9800998ecf8427e  file_2
d41d8cd98f00b204e9800998ecf8427e  file_3
d41d8cd98f00b204e9800998ecf8427e  file_4
d41d8cd98f00b204e9800998ecf8427e  file_5
d41d8cd98f00b204e9800998ecf8427e  file_6
d41d8cd98f00b204e9800998ecf8427e  file_7
d41d8cd98f00b204e9800998ecf8427e  file_8
d41d8cd98f00b204e9800998ecf8427e  file_9
b026324c6904b2a9cb4b88d6d61c81d1  other_file_1
31d30eea8d0968d6458e0ad0027c9f80  other_file_10
26ab0db90d72e28ad0ba1e22ee510510  other_file_2
6d7fce9fee471194aa8b5b6e47267f03  other_file_3
48a24b70a0b376535542b996af517398  other_file_4
1dcca23355272056f04fe8bf20edfce0  other_file_5
9ae0ea9e3c9c6e1b9b6252c8395efdc1  other_file_6
84bc3da1b3e33a18e8d5e1bdd7a18d7a  other_file_7
c30f7472766d25af1dc80b3ffc9a58c7  other_file_8
7c5aba41f53293b712fd86d08ed5b36e  other_file_9

現在のawkコマンドxargsは次のとおりです。

md5sum * | \
sort | \
awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | \
xargs rm

このawk部分は、どのハッシュとも一致しない空の文字列で初期化され、各行のハッシュが現在のファイル(2番目の列)のハッシュ(最初の列)と同じであることをlasthash確認します。lasthashそれでは印刷してみてください。各ステップの終わりには、lasthash現在のファイルのハッシュに設定されます(ハッシュが異なる場合にのみ設定するように制限することはできますが、これはマイナーなものです。特に、ファイルが多い場合はさらにそうです)。一致するファイル)。 awkが送信したファイル名はrmwithに入力されます。xargsこれはデフォルトでrmそのセクションを呼び出してコンテンツを提供しますawk

まず、ディレクトリをフィルタリングする必要があるかもしれませんmd5sum *

編集する:

Marcinsメソッドを使用すると、次の方法も使用できます。

comm -1 -2 \
  <(ls) | \
  <(md5sum * | \
    sort -k1 | \
    uniq -w 32 | \
    awk '{print $2}' | \
    sort) \
xargs rm

lsこれは、取得された各一意のハッシュの最初のファイル名で取得されたファイルのリストから減算されますmd5sum * | sort -k1 | uniq -w 32 | awk '{print $2}'

答え2

次のコマンドを使用して、重複ファイルを識別できます。

md5sum * | sort -k1 | uniq -w 32 -d

答え3

私は走ったレプリカ同様の質問に対する答えは次のとおりです。https://superuser.com/questions/386199/how-to-remove-duplicate-files-in-a-directory

Ubuntuではできますapt-get install fdupes。マンページをぜひ読んでみたいと思います。私の場合、次のように目的の結果が得られました。

fdupes -qdN -r /ops/backup/

" /ops/backup を繰り返し見て、すべての重複ファイルを探します。指定されたファイルの最初のコピーを保持し、残りは自動的に削除します。"これにより、データベースに頻繁に記録されない複数のダンプを簡単に維持することが非常に困難になります。 。

答え4

急いで(またはファイルが多い)ソートオーバーヘッド(時間がかかる)を避けたいが、ハッシュテーブルのメモリオーバーヘッドは気にしない場合(またはメモリが十分でファイルが多い)、

find . -type f -print0 | xargs -0 md5sum | awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }' | xargs -0 rm

find . -type f -print0: すべてのファイルを検索し、null で終わる名前を出力します。

xargs -0 md5sum:ハッシュを並列に計算します(-n必要に応じてmax-argsとmax-procsの調整を参照)。-Pman xargs

awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }':現在表示されているmd5sumを含むawkハッシュテーブルにエントリがある場合、現在表示されているファイル名をnullで終了して印刷します。それ以外の場合は、ハッシュテーブルにファイル名を追加します。

xargs -0 rm:パイプを介してnullで終わる文字列入力を取得し、rmに送信します。

これはfdupesよりはるかに高速です。

ファイル名に改行文字が含まれている場合、md5sumも改行文字でレコードを区切るため、awkは改行文字から切り取ることができます。

これは以下に基づいています。https://stackoverflow.com/questions/11532157/remove-duplicate-lines-without-sortingそしてhttps://stackoverflow.com/questions/9133315/how-can-i-output-null-termerated-strings-in-awk

関連情報