比较两个服务器之间的文件校验和并报告不匹配

时间:2018-04-27 22:04:49

标签: linux bash shell checksum md5sum

我必须将/primary/secondarymachineA个文件夹中所有文件的校验和与远程服务器/bat/snap/中此文件夹machineB中的文件进行比较。远程服务器将包含大量文件以及machineA中的文件。

  • 如果校验和中存在任何不匹配,那么我想报告所有那些在machineA中有完整路径问题的文件,并以非零状态代码退出。
  • 如果一切都匹配,则退出零。

我写了一个命令(不确定是否有更好的方法来编写它)我在machineA上运行,但速度非常慢。有没有办法让它更快?

(cd /primary && find . -type f -exec md5sum {} +; cd /secondary && find . -type f -exec md5sum {} +) | ssh machineB '(cd /bat/snap/ && md5sum -c)'

此外,它打印出文件名,如./abc_monthly_1536_proc_7.data: OK。有没有办法在machineA上打印出该文件的完整路径名?

ssh到远程主机的每个文件绝对不是非常有效。 parallel可以通过同时执行更多文件来加快速度,但更有效的方法是稍微调整命令,以便ssh到machineB并一次性获取所有md5sum。这可能吗?

4 个答案:

答案 0 :(得分:1)

如果您的主要目标不是计算校验和,而是列出差异,那么使用rsync选项运行--dry-run可能更快(更简单)。如果列出了任何文件,它们会有所不同,例如:

MBP:~ jhartman$ rsync -avr --dry-run rsync-test 192.168.1.100:/tmp/; echo $?
building file list ... done
rsync-test/file1.txt

sent 172 bytes  received 26 bytes  396.00 bytes/sec
total size is 90  speedup is 0.45

当然,由于--dry-run目标上没有更改文件。

我希望它会有所帮助, 亚雷克

答案 1 :(得分:0)

如果文件 目录/primary/secondary而不是这些目录下的,则会丢失查找。您可能还希望并行化md5计算。这样就可以了:

#!/bin/bash
cd /primary
md5sum * > /tmp/file-p &
cd /secondary
md5sum * > /tmp/file-s &
wait
cat  /tmp/file-p /tmp/file-s | ssh machineB '(cd /bat/snap/ && md5sum -c)'

使用相对较小的文件集:

$ time find . -exec md5sum {} \;
7e74a9f865a91c5b56b5cab9709f1f36  ./file
631f01c98ff2016971fb1ea22be3c2cf  ./hosts
d41d8cd98f00b204e9800998ecf8427e  ./fortune8547
49d05af711e2d473f12375d720fb0a92  ./vboxdrv-Module.symvers
bf4b1d740f7151dea0f42f5e9e2b0c34  ./tmpavG1pB
a9b0d3af1b80a46b92dfe1ce56b2e85c  ./in.clean.4524

real    0m0.046s
user    0m0.035s
sys 0m0.006s
$ time md5sum *
7e74a9f865a91c5b56b5cab9709f1f36  file
d41d8cd98f00b204e9800998ecf8427e  fortune8547
631f01c98ff2016971fb1ea22be3c2cf  hosts
a9b0d3af1b80a46b92dfe1ce56b2e85c  in.clean.4524
bf4b1d740f7151dea0f42f5e9e2b0c34  tmpavG1pB
49d05af711e2d473f12375d720fb0a92  vboxdrv-Module.symvers

real    0m0.005s
user    0m0.003s
sys 0m0.002s

(只是为了证明发现并不总是最快)。

答案 2 :(得分:0)

使用md5sum,您可以要求它根据输入md5sum文件检查文件。

  

man md5sum :以下两个选项很有用:

     
      
  • -c, --check:从文件中读取MD5总和并检查它们
  •   
  • --quiet:不为每个成功验证的文件打印确定
  •   

所以我们需要做的就是构建这样一个文件并传递它。最简单的是以下(来自machineA):

$ cd /primary; md5sum * | ssh machineB '(cd /bat/snap; md5sum -c - --quiet 2>/dev/null)`
$ cd /secondary; md5sum * | ssh machineB '(cd /bat/snap; md5sum -c - --quiet 2>/dev/null)`

这会将事情报告为:

file1: FAILED
file2: FAILED open or read

这将为您提供每个目录的所有失败文件。您可以稍后使用awk的任何风格进行任何后期处理。

答案 3 :(得分:0)

您可以尝试并行处理其他答案中提到的过程。将+更改为\ ;,并使用&执行bash。

find $(pwd) -type f -exec bash -c "md5sum '{}' &" \;