在处理 jpg 或 h264 压缩文件时,像 fdupes 这样的工具是荒谬的。两个具有完全相同文件大小的此类文件已经很好地表明它们是相同的。
比如说,除此之外,如果提取并比较了 16 个 16 字节的等距块并且它们也是相同的,那将有大量证据让我假设它们是相同的。有没有类似的东西?
(顺便说一句,我知道仅文件大小可能是一个相当不可靠的指标,因为可以选择压缩到某些目标大小,例如 1MB 或 1 CD/DVD。如果在许多文件上使用相同的目标大小,这是非常合理的一些不同的文件将具有完全相同的大小。)
czkawka是一个开源工具,用于查找重复文件(以及图像、视频或音乐)并通过命令行或图形界面呈现它们,重点是速度。您可能会对文档中的这一感兴趣:
使用 GUI 版本,哈希将存储在缓存中,以便以后搜索重复项会更快。
例子:
创建一些测试文件:
我们生成随机图像,然后复制
a.jpg
到b.jpg
以进行复制。只检查大小:
通过哈希值检查文件:
通过将文件分析为图像来检查文件:
您可能希望确保对第一个和最后一个 1MiB 左右进行完整比较(或哈希),其中元数据可以存在,可以在不向压缩数据引入偏移量的情况下进行编辑。此外,从存储中读取的粒度通常至少为 512 个字节而不是 16 个字节,所以不妨这样做;一点点额外的 CPU 时间来比较更多数据是微不足道的。(以 512 字节边界对齐)
(A write sector size of at least 4096B is typical, but a logical sector size of 512 might allow a SATA disk to only send the requested 512B over the wire, if the kernel doesn't widen the request to a full page itself. Which it probably would; the pagecache is managed in whole pages.)
Keep in mind that bit-rot is possible, especially if files have been stored on DVD-R or other optical media. I wouldn't delete a "duplicate" without checking for bitwise identical (or at least identical hashes). Ruling out duplicates quickly based on a hash signature of an early part of a file is useful, but you'd still want to do a full check before declaring two files duplicates for most purposes.
If two files are almost the same but have a few bit-differences, use
ffmpeg -i foo.mp4 -f null -
to find glitches, decoding but doing nothing with the output.If you do find a bitwise difference but neither file has errors a decoder notices, use
or
-f framemd5
to see which frame has a difference that wasn't an invalid h.264 stream. Then seek to there and visually inspect which one is corrupt.Your method could be good for detecting files that are corrupt (or metadata-edited) copies of each other, something that normal duplicate-finders won't do easily. Comments under the question point out that
jdupes
can use hashes of the first N megabytes of a file after a size compare, so that's a step in the right direction.For other use-cases, maybe you'd be ok with less stringent checking, but given that duplicate file finders exist that only compare or hash when there are files of identical size, you can just let one of those run (overnight or while you're going out), and come back to a fully checked list.
Some like
fslint
have the option to hard-link duplicates to each other (or symlink), so next time you look for duplicates, they'll already be the same file. So in my experience, duplicate file finding is not something where I've felt a need to take a faster but risky approach.(
fslint
never got updated for Python3, apparentlyczkawka
is a modern clone in Rust, according to an askubuntu answer.)GNU对你有
cmp
帮助吗?-s
选项来抑制输出并仅使用返回值-i
(跳过初始)和-n
(要比较的字节数),您可以另外定义要比较的字节范围如果文件的数量对于每对文件来说都太大
cmp
,您可能希望首先sort
按文件大小排列所有文件,然后只比较大小相同的组(uniq -D
with-w
)。OP、@vume、idea 的 Shellscript 实现
背景与示例
rsync
看看
rsync
。它有几个级别的检查文件是否相同。该手册man rsync
非常详细,您可以识别我所描述的内容,并且可能还有一些其他有趣的替代方案。最严格的检查是比较每个字节,但是在你写的时候,如果有很多数据,例如一个完整的备份,它会花费很多时间。
标准检查是大小和其他文件属性(例如时间戳)。它通常被认为足够好。
你的想法,@vume,意味着这两个检查级别之间的东西。我还没有见过这样的工具,但我会对这样的工具非常感兴趣。
编辑1:shellscript
vumer
以下 shellscript
vumer
用于dd
执行我认为您想要的操作,@vume。在我的 Lenovo C30 工作站(旧但功能强大)中,我
vumer
使用 Ubuntu Desktop 22.04 LTS iso 文件进行了测试,并比较了使用的时间md5sum
,所以对于大文件来说,它确实比
md5sum
今天被认为是[太]简单的校验和工具要快得多。sha256sum
甚至更慢。我还检查了一个 Debian iso 文件,该文件被转换为用其原始文件替换了几个引导选项
quiet splash
,persistence
并与它的原始文件进行了比较。vumer
运气不好,没有检查修改的几个位置。所以在这里我们必须依靠经典的时间戳来区分。当然md5sum
能分辨出来。因此,这取决于您拥有什么样的文件,以及如何修改它们,
vumer
以及类似的工具是否有用。编辑2:扫描目录树的“oneliner”
这是扫描目录树的“oneliner”
vumer
识别出 30 个文件(15 对)具有相同的 vumer 校验和md5sum
识别出具有相同 md5sum 校验和的 18 个文件(9 对)这意味着
vumer
节省了大量时间;md5sum
只需检查 418 个文件中的 30 个。编辑 3:shellscript
scan4dblt
我用一个脚本替换了“oneliner”
scan4dblt
,我还在一些目录树中测试了它,并对“doer”脚本进行了一些编辑vumer
。编辑 4:改进的 shellscript
scan4dblt
加示例(输出文件)shellscript
scan4dblt
进一步开发并使用一些目录树进行测试,包括大的 iso 文件、图片、视频剪辑和文档。修复了几个错误(当前版本在这里替换了原始版本)。例子:
以下示例显示了由生成的输出文件
即使一小部分文件由 完全检查
md5sum
,完全检查使用了大部分执行时间。时间的比例md5sum
将取决于文件大小。特别是当有很多相对较小的文件时,这种通过 shellscripts 实现的效率会很低,编译后的程序会好得多。但是对于大文件,例如 iso 文件和视频剪辑,shellscripts 可能会做得很好。
编辑 5:关于 shellscripts 的附加评论
如果我再次进行此练习,我将首先因硬链接而分别保存双峰,并在列表中保留一个剩余的 [硬链接] 文件,以检查它是否与以后的比较中的另一个文件匹配。
测试应该检查多大的数据块以便[
vumer
这里调用的工具]做得好也很有趣。这可能必须为要检查重复的文件类型量身定制。我还将测试哪个文件大小,它在中间检查 [by
vumer
] 中很有用。最终(?)评论
我很高兴注意到这个问题得到了多少关注,包括答案和评论。正如 Peter Cordes 在他的回答(以及评论中)中所写的那样,快速测试工具(在我的例子中
vumer
)可以根据要测试的文件类型以多种方式进行改进。在我的回答中,我只实现了@vume 的原始想法,并且可以证明它在许多情况下与其他快速排序方法结合使用以最大限度地减少对完整校验和测试的需求。
There is a tool called imosum that works similar to e.g.
sha256sum
, but it only uses three 16 kB blocks. The samples are taken from beginning, middle and end of the file, and file size is included in the hash also.Example usage for finding duplicates:
Output will have groups of duplicate files:
On my SSD, this took about 10 seconds to process 72 GB worth of digital photos (10k files).
在处理比较文件时,我常用的工具是使用
hash
. 例如:将创建哈希并对它们进行排序,以便您可以在文件中看到重复项。
这使文件与前几个字节相同的置信度要高得多。
作为disketo工具的作者,我可以推荐:https ://github.com/martlin2cz/disketo
克隆它,然后运行:
它将在每一行上输出一个文件路径,该路径至少有一个重复的文件(具有相同的名称),因此具有所有这些重复项的路径(由 TAB 分隔)。
您可以自定义搜索。代替预先安装的“files-with- duplicities.ds”提供自定义磁盘脚本。不仅要比较文件名,还要比较大小,请使用ds文件:
如果您希望基于其他内容(即文件内容的一些 16 字节块)进行比较,请使用自定义子:
或者打开一个问题,我可以添加它。