重複ファイルを検索するコマンドが見つかりましたが、長すぎて混乱しています。
たとえば、削除すると-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
操作を実行し、改行find
でsort
区切られた同じ内容のファイルをインポートする作業を実行しますuniq
。md5sum
答え2
答え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
ディレクトリツリーを何度も移動します。このため、このコマンドはファイル数が少なくても大規模なファイルを含むディレクトリに特に適しています。このような場合、チェックサム呼び出しを避けることは、繰り返しツリーの巡回を避けるよりも重要である可能性があるためです。