重複ファイルを見つける最速の方法は何ですか? [コピー]

重複ファイルを見つける最速の方法は何ですか? [コピー]

重複ファイルを検索するコマンドが見つかりましたが、長すぎて混乱しています。

たとえば、削除すると-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

答え1

次のように短縮できます。

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

md5sum見つかったファイルに対して-exec操作を実行し、改行findsort区切られた同じ内容のファイルをインポートする作業を実行しますuniqmd5sum

答え2

あなたはそれを使用することができますレプリカ。からman fdupes

特定のパスで重複ファイルを検索します。これらのファイルは、ファイルサイズをMD5署名と比較し、バイト単位で比較することによって検索されます。

このように呼び出すと、fdupes -r /path/to/dup/directoryだまされた人のリストが印刷されます。

修正する

試してみることができますフォスリント返品。 fslintを設定したら、次に進みます。cd /usr/share/fslint/fslint && ./fslint /path/to/directory

答え3

元のコマンドを理解したい場合は、段階的に見てみましょう。

find -not -empty -type f

現在のディレクトリまたはそのサブディレクトリで空でないすべてのファイルを見つけます。

   -printf "%s\n"

寸法を印刷します。これらのパラメータを削除すると、代わりにパスが印刷され、後続のステップが中断されます。

 | sort -rn

数値順にソート(-n)、逆順にソート(-r)しかし、昇順にソートし、数値の代わりに文字列で比較することもうまく機能するため、フラグを削除できます-rn

 | uniq -d

重複した連続行を見つけ、その行のみを保持します。

 | xargs -I{} -n1

各入力行(つまり、複数回表示される各ディメンション)に対して次のコマンドを実行しますが、ディメンションに置き換えます{}。単一の呼び出しに複数の入力を渡すのではなく、各入力行に対してコマンドを一度実行します。

   find -type f -size {}c -print0

c各サイズに対して実行されるコマンドは次のとおりです。文字()、またはより正確には、バイトで指定された対応するサイズに一致するファイルを現在のディレクトリで検索します。改行文字を含むファイル名を正しく処理できるように、一致するすべてのファイル名を改行ではなくヌルバイトで区切って印刷します。

 | xargs -0 md5sum

nullで区切られた各名前について、そのファイルのMD5チェックサムを計算します。今回は複数のファイルをmd5sum

 | sort

uniq連続した行のみが考慮されるため、チェックサムに基づいてソートします。

 | uniq -w32 --all-repeated=separate

最初の32バイト(チェックサムの後にファイル名)が一致する行を探します。異なる実行を区別する改行を使用して、そのような重複項目のすべてのメンバーを印刷します。

比較するheemaylが提案したより簡単なコマンド、これの利点は、異なるファイルと同じサイズのファイルのみを確認することです。繰り返しの呼び出しでこれを補償し、findディレクトリツリーを何度も移動します。このため、このコマンドはファイル数が少なくても大規模なファイルを含むディレクトリに特に適しています。このような場合、チェックサム呼び出しを避けることは、繰り返しツリーの巡回を​​避けるよりも重要である可能性があるためです。

関連情報