このコマンドが重複ファイルの検索に使用されているのを見つけましたが、非常に長く、混乱しました。たとえば、-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
あなたはそれを短くすることができます:
find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD
find
、次にsort
のmd5sum
アクションで見つかったファイルの-exec
を実行し、uniq
を実行して、改行で区切られた同じmd5sum
を持つファイルを取得します。
元のコマンドを理解したい場合は、そのステップを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
の呼び出しが繰り返されるため、その代償として、ディレクトリツリーを複数回走査します。これらの理由から、このコマンドは、ツリーの走査を繰り返すのを回避するよりもチェックサムの呼び出しを回避することの方が重要な場合があるため、ファイルが少ないが大きなファイルを含むディレクトリに特に適しています。