수정 및 옵션 명확성을 위해 편집- '--brief'를 잊어 버렸습니다.
diff -rs --brief "$dir1" "$dir2"
-r, --recursive recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief report only when files differ
--speed-large-files assume large files and many scattered small changes
비교하려는 내용에 따라 다른 옵션을 추가하십시오.
-i, --ignore-case ignore case differences in file contents
-b, --ignore-space-change ignore changes in the amount of white space
-B, --ignore-blank-lines ignore changes whose lines are all blank
--strip-trailing-cr strip trailing carriage return on input
--ignore-file-name-case ignore case when comparing file names
diff -rs는 원본의 모든 바이트를 읽고 복사하여 동일한 파일을보고합니다.
diff 출력 형식은 POSIX에 의해 정의되므로 이식성이 뛰어납니다. 다음과 같은 것을 추가 할 수 있습니다.
| 티 diff-out.1 | grep -v -Ee '파일. *와. *는 동일합니다'
chksum 또는 해시를 사용할 수 있지만 파일 트리와 동기화 된 상태로 유지해야하므로 모든 파일의 모든 바이트를 다시 읽게됩니다.
EDIT-댓글이 너무 깁니다.
10GB 이상의 파일이 확인되지 않습니다
이 diff 옵션을 시도해 볼 수 있습니다 : --speed-large-files
사용중인 차이가 매우 큰 파일 (예 : 시스템 메모리보다 큼)에 잘 대처하지 못하여 실제로 동일한 파일 간의 차이를보고 할 수 있습니다.
큰 파일에서 더 나은 -h 옵션 또는 'bdiff'가 있다고 생각했지만 Fedora에서 찾을 수 없습니다. --speed-large-files 옵션은 '-h' "half-hearted compare"옵션의 후속 버전이라고 생각합니다.
다른 접근법은 '-vin'(verbose, itemize, no_run)과 함께 사용한 rsync 명령을 반복하는 것입니다. 이것은 rsync가 찾은 차이점을보고 할 것입니다.
일부 파일을 이동하려면 다음과 같은 스크립트를보고 있습니다.
if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv "$dir2/$path" "$target"
fi
그러나 나는 그것을하지 않는 것이 좋습니다. 근본적인 질문은 "rsync가 파일 계층 구조를 올바르게 복사했는지 어떻게 확인할 수 있습니까?"입니다. diff 또는 다른 도구를 사용하여 rsync가 잘 작동하고 있음을 스스로 입증 할 수 있다면 rsync를 사용하는 대신 해결할 수 있습니다.
rsync -vin은 다른 옵션을 기준으로 비교합니다. 나는 그것이 체크섬으로 기본 설정되었다고 생각했지만, -c 또는 --checksum이 필요합니다.
diff 유틸리티는 실제로 텍스트 줄의 파일을위한 것이지만 이진 파일의 경우 -s 아래에 '동일'을보고해야합니다.
--brief는 파일 내용 출력을 억제해야합니다. 이전에 간과 한 사과는 추악한 스크립트로 반 묻혔습니다.