2013-05-23 1 views
0

내 로컬 md5sum 파일과 일치하는 파일이있는 서버에서 일부 파일의 원격 결과를 비교하려고 시도하면 로컬 서버에서 hashfilename을 제거해야합니다.bash에서 두 쌍의 목록을 비교하는 방법은 무엇입니까?

모두에서 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, 그래서 내 로컬에서 삭제할 수 있습니다

지금까지이 짓 내 컴퓨터. 의견이나 제안이 있으십니까? 당신이 md5sum이와 파일 이름이 동일한 경우에만 일치하는 항목을 고려하는 경우

답변

1

는, 그것은 간단합니다

sort remote_list local_list | uniq -d > duplicate_list 

(중요 사항 :이 파일 목록 중 하나에는 반복이없는 것으로 간주합니다. 당신이 올바르게 md5sum을했는지는 모르겠다.)

+0

나는 당신의 접근법을 시도했지만,'sort : open failed : 31d90af7969f5003b27f68e27e7f2cb1 : No such file or directory'라는 에러가 나에게 왜 발생하는지 알겠습니까? 그거? –

+1

@ValterHenrique : 죄송합니다.'remote_list'와'local_list'는 쉘 변수가 아닌 파일이라고 생각했습니다. 변수를 사용하려면 두 변수를 sort로 파이프해야합니다.'(echo "$ s3_list"; echo "$ local_list") | 정렬 | 유니크 -d'. 그러면 md5sum과 filename이 반환됩니다. 파일 이름을 추가하려면'cut'을 사용해야합니다. 길의 경로 정보를 잃어 버리기 때문에 경로 이름을 정규화하는 더 좋은 방법을 찾아야한다고 생각합니다. – rici

+0

괜찮습니다. 도움을 주셔서 감사합니다. –