web-dev-qa-db-ja.com

MD5ハッシュですべての重複ファイルを検索

(MD5ハッシュに基づいて)すべての重複ファイルを検索し、ファイルサイズ順に並べようとしています。これまでのところ私はこれを持っています:

find . -type f -print0 | xargs -0 -I "{}" sh -c 'md5sum "{}" |  cut -f1 -d " " | tr "\n" " "; du -h "{}"' | sort -h -k2 -r | uniq -w32 --all-repeated=separate

これの出力は次のとおりです。

1832348bb0c3b0b8a637a3eaf13d9f22 4.0K   ./picture.sh
1832348bb0c3b0b8a637a3eaf13d9f22 4.0K   ./picture2.sh
1832348bb0c3b0b8a637a3eaf13d9f22 4.0K   ./picture2.s

d41d8cd98f00b204e9800998ecf8427e 0      ./test(1).log

これが最も効率的な方法ですか?

7
Jamie Curran

「manxargs」から:-Iは-L 1を意味するので、これは最も効率的ではありません。 md5sumにできるだけ多くのファイル名を指定すると、より効率的になります。

find . -type f -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate

もちろん、ファイルサイズはありません。本当にファイルサイズが必要な場合は、md5sumdu -hを実行し、行をjoinとマージするシェルスクリプトを作成します。

7
Olaf Dietsche

オンライン重複排除では、btrfs + duperemoveまたはzfsのいずれかを使用します。これはファイルシステムレベルで機能し、等しいファイルパーツにも一致し、ファイルシステムのCoWを使用して、ファイルをそのままにして、それぞれを1つだけ保持します。いずれかのファイルの共有部分の1つを変更すると、変更が個別に書き込まれます。そうすれば、/ mediaや/ backup/media-2017-01-01のようなものが両方のツリーのそれぞれの一意の情報のサイズのみを消費するようにすることができます。

0

時々、busyboxやNASや他のLinux組み込みハードウェア(IoT)に付属する他のもののようなLinuxコマンドの削減されたセットに取り組んでいます。これらの場合、-print0、名前空間で問題が発生するため、代わりに次のことをお勧めします。

find | while read file; do md5sum "$file"; done > /destination/file

これで、/destination/fileは、通常どおりsortuniqなどのあらゆる種類のプロセスに対応できるようになります。

0
robo