use*_*816 3 png compare image imagemagick
我有两个带图像的文件夹,它们都是PNG.一个文件夹是另一个文件夹的副本,其中一些图像已更改,一些已添加.文件名相同,但图像内容可能不同.遗憾的是,时间戳等其他属性完全是随机的.
我想在较新的文件夹中删除重复项(按内容),只保留更新的和新的.
我安装了ImageMagick以使用compare命令,但我无法弄明白.:-(你能帮帮我吗?先谢谢!
补充:我在Mac OS X上.
你没有说你是在OSX/Linux还是Windows上,但是,我可以帮你入门.无论像这样的日期或时间戳,ImageMagick都可以计算图像中所有像素数据的哈希值(校验和)
identify -format "%# %f\n" *.png
25a3591a58550edd2cff65081eab11a86a6a62e006431c8c4393db8d71a1dfe4 blue.png
304c0994c751e75eac86bedac544f716560be5c359786f7a5c3cd6cb8d2294df green.png
466f1bac727ac8090ba2a9a13df8bfb6ada3c4eb3349087ce5dc5d14040514b5 grey.png
042a7ebd78e53a89c0afabfe569a9930c6412577fcf3bcfbce7bafe683e93e8a hue.png
d819bfdc58ac7c48d154924e445188f0ac5a0536cd989bdf079deca86abb12a0 lightness.png
b63ad69a056033a300f23c31f9425df6f469e79c2b9f3a5c515db3b52c323a65 montage.png
a42a5f0abac3bd2f6b4cbfde864342401847a120dacae63294edb45b38edd34e red.png
10bf63fd725c5e02c56df54f503d0544f14f754d852549098d5babd8d3daeb84 sample.png
e95042f227d2d7b2b3edd4c7eec05bbf765a09484563c5ff18bc8e8aa32c1a8e sat.png
Run Code Online (Sandbox Code Playgroud)
因此,如果您在每个文件夹中执行此操作,您将在每个文件夹的单独文件中将所有文件的校验和及其旁边的名称放在一起.
如果然后合并这两个文件并对它们进行排序,您可以很容易地找到重复项,因为重复的文件将彼此相邻.
比方说,你在两个文件夹中运行上面的命令dira
,dirb
就像这样
cd dira
identify -format "%# %f\n" *.png > $HOME/dira
cd dirb
identify -format "%# %f\n" *.png > $HOME/dirb
Run Code Online (Sandbox Code Playgroud)
然后你可以做这样的事情 awk
awk 'FNR==NR{name[$1]=$2;next}
{
if($1 in name){print $2 " duplicates " name[$1]}
}' $HOME/dir*
Run Code Online (Sandbox Code Playgroud)
因此,该$HOME/dir*
部分将两个文件都传递进去awk
.在片{}
后FNR==NR
仅适用于读取的第一个文件,并且当它被读取,我们保存的关联数组由包含文件名的散列索引.然后,在第二遍,我们检查是否已经看到每个哈希,如果有,我们说它是重复的并输出我们在哈希的第一遍中name[]
找到的名称和我们在第二个上找到的名称从$ 2过来.
这不适用于包含空格的文件名,因此如果这是一个问题,请更改identify
命令在哈希和文件名之间放置一个冒号,如下所示:
identify -format "%#:%f\n" *.png
Run Code Online (Sandbox Code Playgroud)
并更改awk
为awk -F":"
,它应该再次工作.