진행률 보고서와 대규모 디렉토리 비교


13

한 RAID에서 다른 RAID로 2,000,000 개의 파일 (3TB)을 재 동기화했습니다.

내 데이터가 손상되지 않았는지 확인하고 싶습니다.

rsync -c 정말 오랜 시간이 걸립니다.

diff 그것이 무엇을하고 있는지 보여주지 않습니다.

(a) 더 빠른 대안이 있습니까? (b) 비교하는 동안 진행 상황을 보여줄 것입니까?

(나는 Mac에 있고 brew search diff나에게 apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ...이 중 하나가 일을 할 것입니까?)



또한 왜 rsync약 150MB / s로 데이터를 복사했지만 diff60MB / s로만 비교 하는지에 대해 혼란 스럽습니다 ...?
Dan

1
복사 rsync속도는 rsync기본적으로 b / c가 빠릅니다. 기본적으로 체크섬을 사용하여 파일을 비교하지 않고 크기와 날짜 정보를 확인합니다. rsync -c모든 파일 을 사용할 때 부담스러운 작업 인 체크섬 계산이 필요하므로 이것이 기본값이 아닌 이유입니다.
slm

예, 그러나 diff는 복사하지 않습니다 ... 단지 두 파일을 모두 읽습니다. rsync를 복사하려면 각 바이트를 읽은 다음 쓰십시오. 이것은 처음부터 rsync 였으므로 모든 파일을 복사하고있었습니다.
Dan

답변:


6

수정 및 옵션 명확성을 위해 편집- '--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는 파일 내용 출력을 억제해야합니다. 이전에 간과 한 사과는 추악한 스크립트로 반 묻혔습니다.


mv전체 경로를 유지하면서 드라이브 루트의 "확인 된"폴더에있는 모든 파일에 파일 을 가져 오는 방법이 있습니까? 예, 경우 /disk1/a/b/c/file1와 동일합니다 /disk2/a/b/c/file1, 다음으로 이동합니다 /disk1/verified/a/b/c/file1. 그런 다음 잘못 복사 된 파일 만 만들 수 있습니다. (지금까지 10GB가 넘는 파일이 확인되지 않아 무섭습니다.)
Dan

--speed-large-files
D McKeon

정확히 무엇을합니까?
Dan

내가 실행 rsync -vin하면 바이트 단위 또는 체크섬 비교를 수행합니까? 추가하지 않으면 rsync가 크기 / 날짜 만 비교한다고 생각했습니다 -c. 그리고 내가 읽은 것에서 speed large files비 이진 파일과의 차이 만 만드는 것 같습니다 ... 또는 내가 틀렸습니까?
Dan

diff나에게 "Files __ and ___ differ"... 의 형태로 결과를 제공 sed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"하고 나쁜 파일을 다시 복사하기위한 스크립트를 생성하려고 시도하고 있습니다. 그러나 diff의 출력은 인용되지 않으므로 작동하지 않습니다. 인용 된 경로를 줄 수 있습니까?
Dan

4

diff파일 수에 따른 진행률 보고서 는 다음 과 같습니다 .

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

pv (파이프 뷰어)가 필요합니다 : http://www.ivarch.com/programs/pv.shtml

설명:

  • diff -r 디렉토리와 서브 디렉토리를 재귀 적으로 비교하십시오.
  • diff -q파일의 파일 이름 만 인쇄하십시오. 실제 차이를 인쇄하지 마십시오.
  • diff -s다르지 않은 파일 이름도 인쇄하십시오. 이것은 진행 정보에 중요합니다.
  • pv -l 줄 수에 따라 진행 상황을보고합니다.
  • pv -s count 카운트에 따라 예상 완료 시간입니다.
  • 리디렉션 logfile은 예쁜 출력입니다. 그렇지 않으면의 출력은의 diff상태 표시 줄과 혼합됩니다 pv.

파일 수를 얻으려면 다음 명령을 사용하십시오.

find dir1 -type f | wc -l

다른 파일의 로그 파일을 필터링하십시오.

grep -v "^Files .* identical$" logfile

이 변형은 실시간으로 다른 파일을 인쇄하는 동시에 모든 것을 기록합니다 logfile.

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

또는 다른 파일 만 기록 할 수 있습니다.

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

참고 : 위 명령은 파일 수에 따라 진행률을보고합니다. 작은 파일이 많을 때 가장 효과적입니다. 거대한 파일이 몇 개 있으면 이것으로 많은 즐거움을 얻지 못할 것입니다.

슬프게도 나는 바이트 비교를 기반으로 진행 상황을보고하는 쉬운 방법을 모른다.


메타 데이터 (파일의 실제 내용이 아닌) 만 비교하면 안심하고 rsync를 사용할 수 있습니다. 이것은 훨씬 빠를 것입니다.

상세 사항은:


0

데이터 무결성을 확인하기 위해 일종의 해시 응용 프로그램을 사용하는 것을 살펴볼 것입니다. 많은 중복 파일 찾기 유틸리티가 해시를 사용하여 중복 / 중복을 식별하지 않습니다. 이것은 가치있는 조사 일 것 같습니다.


0

이를 위해 rdiff-backup 을 사용할 수 있습니다 . 두 서버 모두에 설치하면 체크섬을 스마트하게 비교하고 아직 존재하지 않는 것을 동기화합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.