web-dev-qa-db-ja.com

重複ファイルを見つける最も速い方法は何ですか?

このコマンドが重複ファイルの検索に使用されているのを見つけましたが、非常に長く、混乱しました。たとえば、-printf "%s\n"を削除すると、何も出力されません。なんで?さらに、なぜxargs -I {} -n1を使用したのですか?重複ファイルを見つける簡単な方法はありますか?

[4a-o07-d1:root/798]#find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
0bee89b07a248e27c83fc3d5951213c1  ./test1.txt
0bee89b07a248e27c83fc3d5951213c1  ./test2.txt
30
The One

あなたはそれを短くすることができます:

find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD

find、次にsortmd5sumアクションで見つかったファイルの-execを実行し、uniqを実行して、改行で区切られた同じmd5sumを持つファイルを取得します。

45
heemayl

fdupes を使用できます。 man fdupesから:

指定されたパスで重複ファイルを検索します。このようなファイルは、ファイルサイズとMD5シグネチャを比較し、その後にバイトごとの比較を行うことで見つかります。

fdupes -r /path/to/dup/directoryのように呼び出すと、デュープのリストが出力されます。

更新

fslint を試すこともできます。 fslintを設定したら、cd /usr/share/fslint/fslint && ./fslint /path/to/directoryに移動します

39
Rahul

元のコマンドを理解したい場合は、そのステップを1つずつ見ていきましょう。

find -not -empty -type f

現在のディレクトリまたはそのいずれかのサブディレクトリで空でないすべてのファイルを検索します。

   -printf "%s\n"

そのサイズを印刷します。これらの引数を削除すると、代わりにパスが出力され、後続の手順が中断されます。

 | sort -rn

数値順(-n)、逆順(-r)。ただし、昇順での並べ替えや、数値ではなく文字列としての比較も同様に機能するため、-rnフラグを削除できます。

 | uniq -d

重複する連続行を探し、それらのみを保持します。

 | xargs -I{} -n1

入力の各行(つまり、複数回発生する各サイズ)について、次のコマンドを実行しますが、{}をサイズで置き換えます。単一の呼び出しに複数の入力を渡すのではなく、入力の各行に対して1回コマンドを実行します。

   find -type f -size {}c -print0

これは、サイズごとに実行するコマンドです。現在のディレクトリで、文字(c)または正確にバイトで指定されたサイズに一致するファイルを検索します。改行の代わりにnullバイトで区切られた、一致するすべてのファイル名を出力して、改行を含むファイル名が正しく処理されるようにします。

 | xargs -0 md5sum

これらのヌルで区切られた名前のそれぞれについて、そのファイルのMD5チェックサムを計算します。今回は、md5sumの1回の呼び出しに複数のファイルを渡すことができます。

 | sort

uniqは連続する行のみを考慮するため、チェックサムでソートします。

 | uniq -w32 --all-repeated=separate

最初の32バイト(チェックサム、その後にファイル名が続く)で一致する行を見つけます。そのような複製の実行のすべてのメンバーを、改行で区切られた個別の実行とともに印刷します。

heemaylが提案するより単純なコマンド と比較すると、同じサイズの別のファイルを持つチェックサムファイルのみがチェックされるという利点があります。 findの呼び出しが繰り返されるため、その代償として、ディレクトリツリーを複数回走査します。これらの理由から、このコマンドは、ツリーの走査を繰り返すのを回避するよりもチェックサムの呼び出しを回避することの方が重要な場合があるため、ファイルが少ないが大きなファイルを含むディレクトリに特に適しています。

15
MvG