如何删除稍加修改的重复图像?

如何删除稍加修改的重复图像?

过去几年,我用手机和数码单反相机拍了数千张照片,直到最近我才开始考虑照片管理,现在照片管理已经一团糟。我以前

fdupes -r . > picLog &

检索有关重复图像的信息,然后fdupes再次用于删除它们。

但是,仍有数百张(甚至数千张)重复的图片。因此,我使用和来identify -verbose image.jpg比较一些无法区分的图片。有什么方法可以比较这些图片并删除重复的图片吗?fdupesfslint-gui

identify -verbose 8.jpg > log1
identify -verbose 35.jpg > log2
diff log1 log2

这是 diff 的输出

答案1

计算不含元数据的每个图像的哈希值

如果您想要识别图像数据相同但元数据不同的图像(旋转通常仅在元数据中注明),这里有我过去使用过的脚本:

find -type f -a '(' \
        -iname '*.jpg' -o \
        -iname '*.jpeg' -o \
        -iname '*.mov' -o \
        -iname '*.mpg' -o \
        -iname '*.mpeg' -o \
        -iname '*.avi' \
    ')' -print0 |perl -n0e '
    my $f = $_;
    chomp($f);
    (my $fe = $f) =~ s|\x27|\x27\\\x27\x27|g;
    my $md5;
    if($f =~ m|\.[aA][vV][iI]$| or $f =~ m|\.[mM][pP][gG]$|) {
      $md5 = `cat \x27$fe\x27 |md5sum`;
    } else {
      $md5 = `exiftool \x27$fe\x27 -all= -o - |md5sum`;
    }
    chomp($md5); $md5 =~ s| +-\n||;
    print("$md5 $f\n");
' |tee photo-signatures.txt

以上计算图像数据的 MD5 哈希值当前目录和子目录中的所有照片和视频。要查看重复项,请运行:

cat photo-signatures.txt |sort |uniq --check-chars=32 --all-repeated

查看哪些照片重复将被删除重复,运行:

cat photo-signatures.txt |sort |uniq --check-chars=32 --all-repeated=prepend |sed -e '/^$/,+1d' |grep -Po '^.{33}\K.*'

最后,实际删除上述命令列出的照片,|xargs -d '\n' rm最后使用 再次运行它。

上述命令的作用解释

  • -print0find-0使用而不是分割perl记录\x00\n
  • find ... -print0:查找所有文件任何给定扩展名,不区分大小写
  • perl -n0e ...:Perl 脚本,一次处理一个文件
    • (my $fe = $f) =~ s|\x27|\x27\\\x27\x27|g;: 单引号变为'\''(Bash 转义)
    • $md5 = `cat \x27$fe\x27 |md5sum`;: 为了视频文件(不支持元数据exiftool),计算整个文件的 MD5 哈希值
    • $md5 = `exiftool \x27$fe\x27 -all= -o - |md5sum`;:调用exiftool以剥离所有照片元数据并输出到标准输出;计算 MD5 哈希值
    • chomp($md5); $md5 =~ s| +-\n||;:当输入为 stdin 时,删除每行末尾-md5sum
    • print("$md5 $f\n");:输出 MD5 哈希值和文件名
  • |tee photo-signatures.txt:将结果保存到文件并显示它们
  • cat photo-signatures.txt |sort |uniq --check-chars=32 --all-repeated:输出多于一行的行(--all-repeated),但只比较每行的 MD5 哈希部分(--check-chars=32
  • cat photo-signatures.txt |sort |uniq --check-chars=32 --all-repeated=prepend |sed -e '/^$/,+1d' |grep -Po '^.{33}\K.*':与上述相同,但在每组相同的 MD5 哈希值前添加一个空行(--all-repeated=prepend),然后使用sed删除这些空行及其后的第一行(即我们要保留的文件),最后grep仅保留每行的文件名部分
  • |xargs -d '\n' rm:删除从标准输入读取的每个文件

答案2

前段时间,当我使用 Ubuntu 10.04 时,我使用dupeGuru识别重复的照片。效果不错。很久没用了,不知道现在的版本怎么样,不过你可以试试。

相关内容