폴더에 MD5 (또는 이와 유사한)가 있습니까? 두 폴더가 같은지 확인하는 방법은 무엇입니까? 3.txt포함 : 1.txt 1.txt의 텍스트 2.txt 2.txt의 텍스트 3.txt 3.txt의 텍스트 md5sum이 전체를 MyFolder어떻게

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

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


1.txt

1.txt의 텍스트

2.txt

2.txt의 텍스트

3.txt

3.txt의 텍스트


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

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



답변

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


답변

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

diff <(find folder1) <(find folder2)

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

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

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

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


답변

테스트하는 한 가지 방법은 폴더와 해당 하위 폴더에있는 모든 파일의 연결을 기반으로 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}. 이것은 대부분의 경우 작동합니다 (적어도 디렉토리와 하위 디렉토리의 파일 수를 확인합니다).


답변

원래 게시물이 다소 오래되었다는 것을 알았지 만이 정보는 파일이 올바르게 복사되었는지 확인하는 솔루션을 찾는 사람들에게 여전히 가치가 있다고 생각합니다. 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 명령을 루트로 실행해야 할 수도 있습니다.


답변

당신이 확인하고 싶은 경우 재귀 적으로 두 디렉토리 사이의 차이점 /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


답변