如何在bash中比较两个配对列表?

时间:2013-05-23 00:35:03

标签: linux bash shell logic md5sum

我正在尝试将某些文件的远程md5sum结果与我的本地md5sum文件以及hash和{{1}匹配的本地filename文件进行比较应该从本地服务器中删除。

关于从两者中获取md5sum的整个算法已经完成,我有这样的事情:

remote_list="<hash values> <filename>.gz"
local_list="<hash values> <filename>.gz"

但现在我需要对两个列表中的内容进行比较。 我在考虑做两个for's,但我想知道这是一个好方法(并且是一个有效的方法)。

到目前为止,我做到了这一点:

#!/bin/bash
datacenter="amazon"
hostname=`hostname`;
path="backup/server245"

s3=`s3cmd ls --list-md5 s3://company-backup/company/"$datacenter"/"$hostname"/"$path"/`;
s3_list=$(echo "$s3" | tr -s ' ' | cut -d ' ' -f 4,5 | sed 's= .*/= =');
echo "$s3_list"

locally=`md5sum /"$path"/*.gz`;
echo "$locally";

locally_list=$(echo "$locally" | sed 's= .*/= =');
echo "$locally_list";

这给了我这个输出:

d41d8cd98f00b204e9800998ecf8427e #md5 from remote folder
41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz #remote file
541b1bf78682f48867cc99dbb53c4c3a app.20121118040001.gz #remote file
31d90af7969f5003b27f68e27e7f2cb1 app.gz #remote file
31d90af7969f5003b27f68e27e7f2cb1  /backup/server245/app.gz #local file

所以按照这个想法,我在两个地方都有app.gz,所以我可以从我的本地机器上删除它。 有什么想法或建议吗?

1 个答案:

答案 0 :(得分:1)

如果仅在md5sum和文件名相同的情况下考虑匹配,那么它很简单:

sort remote_list local_list | uniq -d > duplicate_list

(重要说明:这假设在任一文件列表中都没有重复。如果你已正确完成md5sums,肯定不应该重复。)