두 폴더에 있는 파일의 md5sum

두 폴더에 있는 파일의 md5sum

하나의 명령으로 md5sum을 통해 두 폴더의 모든 파일을 비교하려고합니다. 데비안에서는 다음과 같은 것(bash)이 있습니다:

$ cd ~/FOLDER1
$ md5sum ~/FOLDER2/* | md5sum -c -

아이디어는 첫 번째 md5sum의 해시 출력이 두 번째 md5sum으로 전달되어 입력 파일로 사용된다는 것입니다. 그러나 이를 테스트하면 FOLDER2의 각 파일을 자체 파일과 비교하고 각 파일에 대해 "OK"를 반환하는 것으로 나타났습니다. 이것이 작동하지 않는 이유는 첫 번째 md5sum의 파일 이름 출력에 전체 경로가 포함되어 있기 때문이라고 생각합니다. 나는 보았지만 md5deep거기에서 나를 도울만한 것을 찾지 못했습니다. 한 폴더에 대해 md5sum을 수행하고 결과를 파일에 기록한 다음 해당 파일을 두 번째 md5sum의 입력으로 사용할 수 있다는 것을 알고 있습니다. 나는 두 개의 명령을 사용하고 파일을 작성하는 대신 파이프를 통해 한 줄로 모든 작업을 수행하고 싶었습니다.

편집 : 허용되는 답변여기(을 사용하여 ) 내가 원하는 것을 수행할 수 있지만 이진 파일을 (올바르게) 비교 diff하는지 모르겠습니다 .diff

편집: md5sum(파일 이름과 "OK" 표시)을 사용하여 원하는 출력을 얻으려면 배치 파일을 작성했습니다. 로 실행합니다 diffFolders.sh ~/FOLDER1 ~/FOLDER2.

#!/bin/bash
HERE=$PWD
cd "$1"
md5sum * > /tmp/md5sum.cmp
cd "$2"
md5sum -c /tmp/md5sum.cmp
cd $HERE

이 스크립트는 에 있는 파일만 비교합니다 ~/FOLDER. 추가 파일이 있는 경우 ~/FOLDER2해당 파일은 비교되지 않으며 해당 파일이 존재한다고 표시되는 출력도 없습니다.

답변1

당신이 사용할 수있는프로세스 대체2 md5sum의 출력을 diff에 전달합니다. 이 경우 md5 출력은 일반 텍스트이므로 Diff는 괜찮습니다. 다음과 같은 것 :

diff <(md5 ~/FOLDER1/* | awk '{print $4}') <(md5 ~/FOLDER2/* | awk '{print $4}')

죄송합니다. 여기에는 데비안이 없어서 테스트할 수 없습니다. 위의 내용은 md5가 있는 OS X에서 테스트되었으며 출력 측면에서 약간 다를 수 있습니다. OS X에서는 md5의 네 번째 열이 실제 md5 합계이므로 이 열만 사용합니다.

awk 대신 를 사용할 수도 있지만 cut4번째 열을 얻으려면 구분 기호를 변경해야 할 수도 있습니다(탭으로 구분되지 않음).

답변2

내 .bashrc 파일에서.
아주 오래된 물건, 많은 분류기 코드를 작성하는 것이 가능해야 합니다. 나는 그것을 다시 쓸 기회가 없었습니다. (영원히 사용되는 임시 수정을 위한 다른 모든 것과 마찬가지로) 이 부끄러운 코드 조각을 게시하고 있습니다. 누군가가 더 잘하고 결과를 게시할 수 있기를 바랍니다. :-)

특징 :

  • 재귀적 디렉토리 횡단
  • md5sum 고유성/차이 확인
  • 전체 경로에 업데이트된 파일을 나열합니다.

코드에 모든 것이 나와 있습니다. arg1은 이전 디렉토리이고 arg2는 새 디렉토리입니다.

function find-updated-files-between-old-new(){
 [ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." > /dev/stderr && return 1;
( ( cat <(cd "$1";find . -type f -printf "+%p\n") <(cd "$2";find . -type f -printf "-%p\n")
 )|sort -k1.2|tee 1>/dev/null >(uniq -us1|awk -v B="$2" 'BEGIN{sub("/$",""B)}/^-/{print B substr($0,3);
 }') >(uniq -ds1|awk -vA="$1" -vB="$2" 'BEGIN{B=g(B);A=g(A)}{
 C=substr($0,3);if(f(A)!=f(B))print B C;}function g(y){sub("/$","",y);return y}
 function f(y,z,e){e="md5sum \""y""C"\"";e|getline z;close(e);return substr(z,1,32)}' )
 ) | cat
}

함수 이름에서 알 수 있듯이

function find-files-name-collision-between-dir1dir2(){
 [ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." > /dev/stderr && return 1;
( cat <(cd "$1";find . -type f -printf "+%p\n") <(cd "$2";find . -type f -printf "-%p\n") )|sort -k 1.2 | uniq -d -s 1
}

완전성을 위해서만

function mv-mergedir1todir2(){
 [ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." && return 1;
 ( cd "$1" ; tar cf - . ) | (cd "$2" ; tar --keep-old-files xvf - )
 echo -e "Done. Duplicate filnames are not replaced. \n#Use \n# ( cd \"$1\" ; tar cf - . ) | (cd \"$2\" ; tar --overwrite xvf - ) \n#if you do not like that. "
}

이 끔찍한 코드 조각은 내 bashrc에서 제거되어야 하지만 오랫동안 존재해 왔습니다...

답변3

길지만 파일 이름을 반환하고 일치하면 OK를 반환합니다. '-c'를 사용하는 대신 각 폴더의 파일에 대해 md5sum을 실행하여 출력된 두 문자열을 비교합니다.

for f in *; do [[ -f $f ]] && if [ $(md5sum "$f" | cut -d" " -f1) == $(md5sum dir2/"$f" | cut -d" " -f1) ]; then echo "$f" "OK"; else echo "$f" "MODIFIED"; fi; done

관련 정보