폴더에 MD5 (또는 이와 유사한)가 있습니까? 두 폴더가 같은지 확인하는 방법은 무엇입니까?


10

md5sum아카이브로 압축하지 않고 폴더 의 (또는 유사한 계산) 을 찾고 싶습니다 .

예를 들어, 폴더의 경우 MyFolder우리는 파일이 1.txt, 2.txt등을 3.txt포함 :


1.txt

1.txt의 텍스트

2.txt

2.txt의 텍스트

3.txt

3.txt의 텍스트


md5sum이 전체를 MyFolder어떻게 계산할 수 있습니까? 방법이 있습니까? 이것을 사용하여 두 폴더의 내용이 같은지 확인하고 싶습니다.

두 개의 CD 또는 폴더가 동일한 지 확인하는 데 유용 할 수 있습니다. 쉬운 방법을 원합니다.

답변:


15

md5deep의 도구는 바로이 목적을 위해 개발되었다. 많은 Linux 배포판에서이를 패키지 형태로 제공합니다.


1
고마워! 그것은 나에게 잘 작동했다. 같은 문제를 가진 다른 사용자에게 다음과 같이 : sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory Thx 많이.
GarouDan

@GarouDan. 표시 한 명령은 기호 링크를 따릅니다. 이 -o옵션을 사용하여 파일 형식을 처리 할 수 있습니다 .
Peter.O

오, 잘 모르겠어요 ... 정말 도움이됩니다. 기억 할게요!
GarouDan

4

보관하지 않으려는 경우 다음과 같은 작업을 수행 할 수 있습니다.

diff <(find folder1) <(find folder2)

find보다 정확한 명령 을 적용해야 할 수도 있습니다 .

편집-exec 파일의 내용을 비교하기 위해 찾기 호출에 추가 할 수 있습니다. 이것과 비슷한 것 :

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

이것을 적용하고 싶을 수도 있습니다.


흥미로운 지적입니다. 여기에는 각 폴더의 모든 파일이 나열되어 있지만 실제로 많은 양의 아카이브가있는 경우 ... 각 폴더에 동일한 파일이 있는지 (데이터로-md5sum 도구 사용) 어떻게 확인할 수 있습니까?
GarouDan

1
그런 다음 각 파일의 MD5SUM 출력을 비교하십시오. find, md5sum 및 diff 명령을 다르게 문자열 화하면됩니다.
sybreon

당신의 아이디어에 대해서도 감사합니다.
GarouDan

3

테스트하는 한 가지 방법은 폴더와 해당 하위 폴더에있는 모든 파일의 연결을 기반으로 md5sum을 생성하는 것입니다. 또한 파일의 이름이 동일해야합니다 (동일한 정렬 순서 여야 함). 다음 코드가 작동해야합니다.

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

당신이 진정 등의 파일 이름, 신경 경우에 무엇을 비교하는 루프를 사용할 수 ${_files_in_old_dir}${_files_in_new_dir}. 이것은 대부분의 경우 작동합니다 (적어도 디렉토리와 하위 디렉토리의 파일 수를 확인합니다).


이것은 멋진 스크립트입니다 ... thx @Chris. 그러나 문제가 있습니다 ... 고양이를 사용 하면 하위 폴더가 오류와 충돌합니다 ... 그것을 해결할 아이디어가 있습니까? 정말 고마워.
GarouDan

그것은 나를 위해 잘 작동합니다. 쉘이 지원하는지 확인하십시오 globstar. 오류가 무엇입니까?
Chris Down

1
"작동"(+1) ...하지만 bash 4의 globstar는 디렉토리 symlinks 를 따르지만 어느 디렉토리에 symlink가 포함되어 있으면 문제가됩니다.
Peter.O

@fered Good call, 나는 테스트에 추가했다.
Chris Down

0

원래 게시물이 다소 오래되었다는 것을 알았지 만이 정보는 파일이 올바르게 복사되었는지 확인하는 솔루션을 찾는 사람들에게 여전히 가치가 있다고 생각합니다. Rsync가 데이터를 복사하는 가장 좋은 방법 일 수 있으며이 스레드에 제공된 답변은 훌륭하지만 Linux에 익숙하지 않은 사람들에게는 더 자세한 설명을 제공하려고합니다.

시나리오 : 방금 서브 디렉토리와 파일이 많은 디스크에서 다른 디스크로 데이터를 복사했습니다. 모든 데이터가 올바르게 복사되었는지 확인하려고합니다.

먼저 명령을 실행하여 md5deep이 설치되어 있는지 확인하십시오 md5deep -v.

'command not found'와 같은 메시지가 표시되면 md5deep by를 설치하십시오 apt-get install md5deep.

일반 파일 만 처리하고 싶다고 가정합니다. 다른 유형의 파일을 처리하려면 md5deep 매뉴얼의 -o 플래그를 참조하십시오. ( man md5deep)

지금 당신은 갈 수 있습니다, 우리는 당신이 파일을 복사 한 가정 /mnt/orginal/mnt/backup, 당신이 사용중인 디렉토리에 대한 이러한 대체합니다.

먼저 소스 디렉토리로 변경하십시오. 복사하거나 백업 한 파일의 원본 소스입니다.

cd /mnt/orginal

그런 다음 각 파일의 체크섬을 만드십시오.

md5deep -rel -o f . >> /tmp/checksums.md5

이 명령은 다음을 설명했습니다.

-r 재귀 모드를 활성화합니다

-e 진행 표시기 표시

-l 상대 파일 경로를 활성화합니다.

-o f 일반 파일에서만 작동합니다 (블록 장치, 명명 된 파이프 등은 아님).

. md5deep에게 현재 디렉토리에서 시작하도록 지시합니다.

>> /tmp/checksums.md5md5deep에게 모든 출력을로 리디렉션하도록 지시합니다 /tmp/checksums.md5.

이전 버전의 콘텐츠를 덮어 쓰려면 /tmp/checksums.md5사용 >하지 말고 사용하십시오.>>

이 명령은 io-speed 및 데이터 크기에 따라 시간이 오래 걸릴 수 있습니다. md5deep의 성능을 높이기 위해 nice 및 / 또는 ionice로 실험 할 수는 있지만이 답변의 범위를 벗어납니다.

체크섬 작성이 완료되면 다음과 유사한 항목이있는 파일이 생깁니다.

69c0a826b29c8f40b7ca5e56e53d7f83 /oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

첫 번째 열은 md5 체크섬이고 두 번째 열은 체크섬이 속한 파일의 상대 경로입니다.

체크섬 파일에 존재하는 파일 수를 보려면 다음 명령을 실행하십시오.

wc /tmp/checksums.md5 -l

이제 복사 된 데이터가 올바른지 확인하려고합니다.

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

체크섬을 만들 때와의 유일한 차이점은 checksums.md5 파일의 항목이 일치 하지 않으면 파일의 현재 해시를 표시하는 -X입니다 . 따라서 테스트가 끝날 때 /tmp/compare.result비어 있으면 체크섬이 일치하므로 모든 파일이 올바르게 복사된다는 것을 신뢰할 수 있습니다.

디렉토리에 /tmp/checksums.md5추가 파일이 있으면 파일에 나열된 파일 만 올바른 체크섬을 검사합니다 /mnt/backup. md5deep은 이에 대해 알리지 않습니다.

노트:

  • 출력 파일을 저장하기 위해 반드시 경로 재 지정을 사용할 필요는 없습니다. 자세한 내용은 md5deep 설명서를 참조하십시오.

  • 처리중인 파일의 권한에 따라 md5deep 명령을 루트로 실행해야 할 수도 있습니다.


0

당신이 확인하고 싶은 경우 재귀 적으로 두 디렉토리 사이의 차이점 /path1/path2 없이 사용하여 md5deep:

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

설명:

  • path1의해 인쇄 된 모든 줄 findpath1( cd /path1)에 상대적으로 만들었습니다.
  • 현재 경로의 모든 파일을 재귀 적으로 나열합니다 ( && find . -type f).
  • ( )에 find대한 입력으로 각 라인 출력 사용md5| xargs md5

차이점이 있으면 출력은 다음과 같습니다.

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.