15

2つのファイルがあります。それらをmd5s1.txtおよびmd5s2.txtと呼びましょう。両方に出力が含まれています

find -type f -print0 | xargs -0 md5sum | sort > md5s.txt

別のディレクトリのコマンド。多くのファイルの名前が変更されましたが、内容は同じままでした。したがって、それらは同じmd5sumを持つ必要があります。次のような差分を生成したい

diff md5s1.txt md5s2.txt

ただし、各行の最初の32文字のみを比較する必要があります。つまり、ファイル名ではなくmd5sumのみを比較する必要があります。md5sumが等しい行は、等しいと見なす必要があります。出力は通常のdiff形式である必要があります。

4

3 に答える 3

16

簡単なスターター:

diff <(cut -d' ' -f1 md5s1.txt)  <(cut -d' ' -f1 md5s2.txt)

また、

diff -EwburqN folder1/ folder2/
于 2011-05-18T15:43:42.077 に答える
3

diffonを使用して md5 列のみを比較し、 を使用して追加または削除された行の行番号のみを出力するように<(cut -c -32 md5sums.sort.XXX)指示します。これをパイプして、ファイルからそれらの行のみを出力します。diff--old/new-line-format='%dn'$'\n'ed md5sums.sort.XXXmd5sums.sort.XXX

diff \
    --new-line-format='%dn'$'\n' \
    --old-line-format='' \
    --unchanged-line-format='' \
    <(cut -c -32 md5sums.sort.old) \
    <(cut -c -32 md5sums.sort.new) \
    | ed md5sums.sort.new \
    > files-added
diff \
    --new-line-format='' \
    --old-line-format='%dn'$'\n' \
    --unchanged-line-format='' \
    <(cut -c -32 md5sums.sort.old) \
    <(cut -c -32 md5sums.sort.new) \
    | ed md5sums.sort.old \
    > files-removed

問題edは、ファイル全体をメモリにロードすることです。これは、多くのチェックサムがある場合に問題になる可能性があります。diff の出力を にパイプする代わりにed、次のコマンドにパイプします。これにより、使用するメモリが大幅に削減されます。

diff … | (
    lnum=0;
    while read lprint; do
        while [ $lnum -lt $lprint ]; do read line <&3; ((lnum++)); done;
        echo $line;
    done
) 3<md5sums.sort.XXX
于 2011-09-18T12:28:59.973 に答える
1

重複ファイルを探している場合は、fdupes でこれを実行できます。

$ fdupes --recurse

ubuntuでは、次のようにしてインストールできます

$ apt-get install fdupes
于 2011-09-18T14:05:27.337 に答える