답변:
보관하지 않으려는 경우 다음과 같은 작업을 수행 할 수 있습니다.
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}
. 이것은 대부분의 경우 작동합니다 (적어도 디렉토리와 하위 디렉토리의 파일 수를 확인합니다).
globstar
. 오류가 무엇입니까?
원래 게시물이 다소 오래되었다는 것을 알았지 만이 정보는 파일이 올바르게 복사되었는지 확인하는 솔루션을 찾는 사람들에게 여전히 가치가 있다고 생각합니다. 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.md5
md5deep에게 모든 출력을로 리디렉션하도록 지시합니다 /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
의해 인쇄 된 모든 줄 find
을 path1
( 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
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 많이.