md5sum
아카이브로 압축하지 않고 폴더(또는 유사한 계산)를 찾고 싶습니다 .
예를 들어, 폴더에 다음 을 포함하는 파일 및 가 MyFolder
있는 경우 :1.txt
2.txt
3.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
모든 줄을 인쇄 합니다 .find
path1
cd /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