从一个硬盘驱动器复制到另一个硬盘驱动器后验证大目录

Pet*_*r A 16 ubuntu file-transfer file-copy files checksum

我有一个使用 Ubuntu 的家庭文件服务器。

最近,我的一个驱动器装满了,所以我又买了一个,把它扔进去了。

我有一个非常大的文件夹,该目录大小约为 1.7?T,并且包含相当数量的文件。

我使用GCP将文件从旧驱动器复制到新驱动器,它似乎运行良好。

我现在想在删除旧驱动器中的数据以释放空间之前,对照旧驱动器上的原始目录验证新驱动器上的新目录。我知道我可以做一个 CRC 检查来做到这一点。

具体怎么做呢?

Ant*_*gan 18

我只会使用以下diff命令:

diff -rq --no-dereference /path/to/old/drive/ /path/to/new/drive/
Run Code Online (Sandbox Code Playgroud)

这会读取并比较目录树中的每个文件并报告任何差异。该-r标志递归地比较目录,而-q标志只是在文件不同时向屏幕打印一条消息——而不是打印实际差异(就像文本文件一样)。--no-dereference如果存在不同的符号链接,例如,在一个目录中为符号链接,而在其对应目录中为链接到的文件的副本,则该标志可能很有用。

如果diff命令没有输出 output,则表示目录树确实相同;可以运行echo $?验证一下它的退出状态是0,说明两组文件是一样的。

我认为在这种情况下计算 CRC 或校验和不是特别有益。如果这两组文件位于不同的系统上,并且每个系统都可以计算自己的一组文件的校验和,那么只需要通过网络发送校验和,那就更有意义了。计算校验和的另一个常见原因是保留校验和的副本以备将来使用。

  • @PeterA 没错。Diff 适用于*所有* 文件类型。它可以提供有关文本文件之间特定差异的更多信息,而对于非文本文件,它仅报告是否存在差异。顺便说一句,我在命令的预期输出上用额外的句子编辑了我的答案。 (2认同)

meu*_*euh 9

rsync通常用于复制文件而不是gcp,但它也可用于验证副本,无论它是如何制作的。简单地做

rsync -niaHc /origfolder/ /copyfolder
Run Code Online (Sandbox Code Playgroud)

小心以 . 结尾的第一个文件夹名称(源)/。选项是

  • -n 不要复制(不做任何更改)
  • -i 列举差异
  • -a保留(即比较,因为我们有-n)权限、所有权、符号链接等,并向下递归目录
  • -H 保留硬链接
  • -c 比较校验和

输出显示了一个代码,详细说明了每个不同文件或目录的差异。如果它们相同,则没有输出。如果比较的那个方面没问题,代码中有列YXcstpoguax,其中每个字符都是一个点.,或者是一个字母:

Y is type of update: 
   < sent (not appropriate in this case)
   > need to copy 
   c missing file or directory
   h is hard link
   . no update
   * and rest of line is a message, eg *deleting
X file type: f file  d dir  L symlink  D device S special file
c checksum differs. + new item  " " same
s size differs
t timestamp differs
p permissions differ
o owner differ
g group differ
u (not used)
a acl differ
x extended attributes differ
Run Code Online (Sandbox Code Playgroud)

例如,

.d..t...... a/b/                    directory timestamp differs
cL+++++++++ a/b/d -> /nosuch2       symbolic link missing
cS+++++++++ a/b/f                   special file missing (a/b/f is a fifo)
>f..t...... a/b/ff                  file timestamp differs
hf          a/b/xx1 => a/b/xx       files should be a hard linked
cLc.t...... a/b/z -> /tmp/hi2       symbolic link to different name
cd+++++++++ a/c/                    directory missing
>f+++++++++ a/c/i.10                missing file needs to be copied
Run Code Online (Sandbox Code Playgroud)

请参阅man rsync--itemize-changes的更多细节。如果您在第 3列c或第 4s列中存在差异,那么您的数据已严重损坏。其他标志(例如不同的权限、所有者或时间戳)对您来说可能不太重要。如果所有文件都标记为“丢失”,那么您可能没有提供正确的目录进行比较。如果您确定,在没有-n标志的情况下运行 rsync将“修复”差异。