答案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
最后使用 再次运行它。
上述命令的作用解释
- 的
-print0
和find
的-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识别重复的照片。效果不错。很久没用了,不知道现在的版本怎么样,不过你可以试试。