复制数千个文件后检查数据完整性

复制数千个文件后检查数据完整性

我将数千个文件复制到 exFAT MicroSD 卡中。

文件数和字节数是相同的,但我如何知道数据是否损坏?

如果 JackPal Android 终端也支持该命令就好了。

答案1

使用 MD5 和是一个好方法,但使用它的规范方法是:

  1. cd到源文件的目录并发出:

    md5sum * >/path/to/the/checksumfile.md5
    

如果您有很多级别的目录,您可以使用shopt -s globstar并替换***/*.

请注意,MD5 文件中的文件规范与命令行中提供的完全相同(相对路径,除非您的模式以 开头/)。

  1. cd到复制文件的目录并发出:

    md5sum -c /path/to/the/checksumfile.md5
    

使用-cmd5sum读取提供的 MD5 文件中的文件规格,计算这些文件的 MD5,并将它们与 MD5 文件中的值进行比较(这就是为什么文件规格通常最好保持相对,因此您可以重新使用 MD5文件在不同目录中的文件)。

通过这种方式使用 MD5 总和可以立即告诉您有关 MD5 差异以及丢失文件的信息。

答案2

卸载、弹出和重新安装设备。然后使用

diff -r source destination

如果您以前经常rsync进行复制,rsync -n -c可能会非常方便,而且几乎与diff.但它并没有进行逐位比较;它使用 MD5 校验和。


有一些类似的答案以及其他详细信息:从一个硬盘复制到另一个硬盘后验证大目录

答案3

rsync -rc original-dir/ copied-dir/

-c使 rsync 通过 MD5 校验和来比较文件(如果没有它,它通常只使用时间戳和大小来进行更快的比较)。

这也将导致 rsync 复制它从目标中看到的不同或丢失的任何内容。为了避免这种情况,您还可以使用-n-i。前者确保 rsync 不做任何更改而仅进行比较,后者使其显示所看到的差异。

例如,我有以下目录:

$ find dir1/ dir2/
dir1/ dir2/
dir1/
dir1/d
dir1/d/a
dir1/d/b
dir1/c
dir2/
dir2/d
dir2/d/a
dir2/d/b

和这个:

$ rsync -rcni dir1/ dir2/
>f+++++++++ c
>fc.T...... d/b

通过所有这些+s 告诉我,该文件c不存在于 中dir2,而 filed/b中存在,但不同(由c第一列中的 表示)。说T是时候更新了(如果我们没有使用的话-n)。

-irsync 的联机帮助页中描述了 的输出格式。您可以通过键入(并按 Enter 键)man rsync进入解释该输出的部分。/--itemize-changes$

答案4

可以为各个文件生成哈希值并将其输出到一个文本文件中,然后可以生成该文本文件的 MD5 哈希值。对于该文本文件,您可以使用任何您喜欢的哈希函数,因为此哈希列表的大小不足以在使用更难的哈希函数(例如sha512sum.
我使用它是cksum因为它的普遍可用性(sum并且crc32不包含在 JackPal 的 Android 终端中)和最高速度。它不是像 那样的加密、安全算法sha512sum,但是任意哈希函数足以在离线环境中验证数据完整性。但是,如果您希望所有文件散列具有相同的长度(即 32),请使用md5sum普遍支持的最快的安全的哈希算法(虽然它比较老,但比任何算法都快得多)算法并会完成它的工作)。

在源和目标上运行以下命令:

cksum /path/to/folder/* | tee -a hash.files.txt |cut -f 1 -d " " >>hash.list.txt #extracts pure hashsum string only for the output, to hide the different file path.
md5sum hash.list.txt

...或者使用单个命令:

cksum /path/to/folder/* | tee -a hash.files.txt | cut -f 1 -d " " | tee -a hash.list.txt | sort | md5sum

哈希和列表文件的名称(哈希表.txt哈希文件.txt在我的示例中)可以是您指定的任何内容。生成两个文件以便能够识别损坏的文件(第一个文件也包含文件名,第二个文件用于比较)。

sort因为shbash实现字母排序略有不同。sort补偿它。

相关内容