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

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

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

예를 들어, 폴더에 다음 을 포함하는 파일 및 가 MyFolder있는 경우 :1.txt2.txt3.txt


1.txt

1.txt에 텍스트 쓰기

2.txt

2.txt에 텍스트 쓰기

3.txt

3.txt에 텍스트 쓰기


md5sum이 모든 것을 어떻게 계산할 수 있습니까 MyFolder? 어떤 방법이 있나요? 이를 사용하여 두 폴더의 내용이 동일한지 확인하고 싶습니다.

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

답변1

이것md5 깊이이를 위해 도구가 개발되었습니다. 많은 Linux 배포판에서는 이를 소프트웨어 패키지로 제공합니다.

답변2

보관하고 싶지 않다면 이렇게 할 수도 있습니다.

diff <(find folder1) <(find folder2)

find더 정확하게 하려면 명령을 조정해야 할 수도 있습니다 .

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

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

조정할 수도 있다는 점을 명심하세요.

답변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}. 이는 대부분의 경우 작동합니다(적어도 디렉터리와 해당 하위 디렉터리의 파일 수를 확인합니다).

답변4

확인하고 싶다면재귀적으로두 디렉토리의 차이점 /path1/path2 아니요사용 md5deep:

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

설명하다:

  • ( ) 를 기준으로 path1모든 줄을 인쇄 합니다 .findpath1cd /path1
  • 모두 나열문서현재 경로의 recurse( && 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

관련 정보