我必须将/primary
中/secondary
和machineA
个文件夹中所有文件的校验和与远程服务器/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。这可能吗?
答案 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 '{}' &" \;