我从命令中获得了此输出s3cmd ls --list-md5
。
2013-05-22 12:20 1965154 41eae9b40d23de2f02bf07635870f6d0 s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121117040001.gz
2013-05-22 12:20 11456836 541b1bf78682f48867cc99dbb53c4c3a s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121118040001.gz
..
我正在尝试验证md5sum
存储桶中的对象是否与md5sum
本地机器中的对象匹配。因此,我需要获取结果hash
作为fourth
列,并将文件名作为fifth
列。
像那样:
41eae9b40d23de2f02bf07635870f6d0 s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121117040001.gz
但我只需要文件名,因此我使用命令basename
(我只是不知道如何在这里使用它,但我会弄清楚),最后看起来像这样:
s3=`s3cmd ls --list-md5 s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/`;
echo "$s3";
echo "$s3" | tr -s ' ' | cut -d ' ' -f 4;
echo "$s3" | tr -s ' ' | cut -d ' ' -f 5;
现在我需要将结果存储在echo's
同一个变量中,如下所示:
41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz
因此我可以将结果s3cmd ls --list-md5sum
与我md5sum *.gz
本地跑步的结果进行比较。
更新 使用 diff 方法我的命令如下所示:
ls --list-md5 s3://company-backup/company/amazon/ip-11-11-111-11/backup/server245/ \
| tr -s ' ' \
| cut -d ' ' -f 4,5 \
| sed 's= .*/= =' \
| diff -w - <(md5sum /backup/server245/*.gz)
给出以下结果:
1,50c1,49
< d41d8cd98f00b204e9800998ecf8427e
< 41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz
< 541b1bf78682f48867cc99dbb53c4c3a app.20121118040001.gz
..
---
> 41eae9b40d23de2f02bf07635870f6d0 /backup/diveo245/app.20121117040001.gz
> 541b1bf78682f48867cc99dbb53c4c3a /backup/diveo245/app.20121118040001.gz
..
但是如何知道不同的文件呢?(因为所有相同的文件我都可以删除了)
答案1
您不需要变量。您可以使用它diff
来比较两个不同命令的输出:
s3cmd ls --list-md5 \
| tr -s ' ' \
| cut -d ' ' -f 5,6 \
| sed 's= .*/= =' \
| diff -w - <(md5sum *.gz)
您可能需要将sort
文件输出为相同的顺序。
答案2
@choroba 的答案是正确的,但这里是另一种使用变量的方法:
s3=`s3cmd ls --list-md5 \
s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/ |
awk '{print $4,$5}' | awk -F"[/ ]" '{print $1,$NF}'`
echo $s3
41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz