我将数千个文件复制到 exFAT MicroSD 卡中。
文件数和字节数是相同的,但我如何知道数据是否损坏?
如果 JackPal Android 终端也支持该命令就好了。
答案1
使用 MD5 和是一个好方法,但使用它的规范方法是:
cd
到源文件的目录并发出:md5sum * >/path/to/the/checksumfile.md5
如果您有很多级别的目录,您可以使用shopt -s globstar
并替换*
为**/*
.
请注意,MD5 文件中的文件规范与命令行中提供的完全相同(相对路径,除非您的模式以 开头/
)。
cd
到复制文件的目录并发出:md5sum -c /path/to/the/checksumfile.md5
使用-c
,md5sum
读取提供的 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
)。
-i
rsync 的联机帮助页中描述了 的输出格式。您可以通过键入(并按 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
因为sh
和bash
实现字母排序略有不同。sort
补偿它。