한 하드 드라이브에서 다른 하드 드라이브로 복사한 후 큰 디렉터리 확인

한 하드 드라이브에서 다른 하드 드라이브로 복사한 후 큰 디렉터리 확인

Ubuntu를 사용하는 홈 파일 서버가 있습니다.

최근에 내 드라이브 중 하나가 가득 차서 다른 드라이브를 하나 가져와 거기에 버렸습니다.

나는 매우 큰 폴더를 가지고 있는데, 그 디렉토리의 크기는 약 1.7T이고 상당한 양의 파일이 포함되어 있습니다.

나는 사용했다GCP이전 드라이브에서 새 드라이브로 파일을 복사했는데 제대로 작동한 것 같습니다.

이제 공간을 확보하기 위해 기존 드라이브에서 데이터를 삭제하기 전에 기존 드라이브의 원래 디렉터리와 비교하여 새 드라이브의 새 디렉터리를 확인하고 싶습니다. 이를 위해 CRC 검사를 수행할 수 있다는 것을 이해합니다.

구체적으로 어떻게 하면 되나요?

답변1

나는 단순히 다음 diff명령을 사용합니다.

diff -rq --no-dereference /path/to/old/drive/ /path/to/new/drive/

이는 디렉토리 트리의 모든 파일을 읽고 비교하고 차이점을 보고합니다. 플래그 -r는 디렉터리를 재귀적으로 비교하는 반면 -q플래그는 파일이 다를 때 화면에 메시지를 인쇄합니다. 실제 차이점을 인쇄하는 것과는 대조적입니다(텍스트 파일의 경우처럼). 플래그 --no-dereference는 서로 다른 기호 링크가 있는 경우 유용할 수 있습니다(예: 한 디렉터리에 기호 링크가 있고 해당 디렉터리에 링크된 파일의 복사본).

diff명령이 인쇄 되면출력 없음, 이는 디렉토리 트리가 실제로 동일하다는 것을 의미합니다. 실행하여 종료 상태가 두 파일 세트가 모두 동일함을 나타내는인지 echo $?확인할 수 있습니다 .0

이 경우에는 CRC나 체크섬을 계산하는 것이 특히 유익하다고 생각하지 않습니다. 두 파일 세트가 서로 다른 시스템에 있고 각 시스템이 자체 파일 세트에 대한 체크섬을 계산할 수 있으므로 체크섬만 네트워크를 통해 전송하면 되는 경우가 더 합리적입니다. 체크섬을 계산하는 또 다른 일반적인 이유는 나중에 사용할 수 있도록 체크섬 복사본을 보관하는 것입니다.

답변2

재동기화대신 파일을 복사하는 데 자주 사용되지만 gcp복사본이 만들어졌는지 확인하는 데에도 사용할 수 있습니다. 간단히 하세요

rsync -niaHc /origfolder/ /copyfolder

첫 번째 폴더 이름(소스)은 /. 옵션은 다음과 같습니다

  • -n복사하지 마세요(변경하지 마세요)
  • -i차이점을 항목별로 분류하다
  • -a권한, 소유권, 심볼릭 링크 등을 보존(즉, 가지고 있기 때문에 비교 -n)하고 디렉토리를 반복적으로 삭제합니다.
  • -H하드 링크 보존
  • -c체크섬 비교

출력에는 서로 다른 각 파일 또는 디렉터리의 차이점을 자세히 설명하는 코드가 표시됩니다. 동일하면 출력이 없습니다. 코드에는 비교의 해당 측면이 괜찮은 경우 YXcstpoguax각 문자가 점이거나 문자인 열이 있습니다..

Y is type of update: 
   < sent (not appropriate in this case)
   > need to copy 
   c missing file or directory
   h is hard link
   . no update
   * and rest of line is a message, eg *deleting
X file type: f file  d dir  L symlink  D device S special file
c checksum differs. + new item  " " same
s size differs
t timestamp differs
p permissions differ
o owner differ
g group differ
u (not used)
a acl differ
x extended attributes differ

예를 들어,

.d..t...... a/b/                    directory timestamp differs
cL+++++++++ a/b/d -> /nosuch2       symbolic link missing
cS+++++++++ a/b/f                   special file missing (a/b/f is a fifo)
>f..t...... a/b/ff                  file timestamp differs
hf          a/b/xx1 => a/b/xx       files should be a hard linked
cLc.t...... a/b/z -> /tmp/hi2       symbolic link to different name
cd+++++++++ a/c/                    directory missing
>f+++++++++ a/c/i.10                missing file needs to be copied

자세한 내용은 man rsync아래를 참조하세요 . 세 번째 또는 네 번째 열에 --itemize-changes차이가 있으면 심각한 데이터 손상이 있는 것입니다. 다른 권한, 소유자 또는 타임스탬프와 같은 다른 플래그는 덜 중요할 수 있습니다. 모든 파일이 "누락"으로 표시되면 비교할 올바른 디렉터리를 지정하지 않았을 가능성이 높습니다. 확실하다면 플래그 없이 rsync를 실행하면 차이점이 "수정"됩니다.cs-n

답변3

나는 같은 질문을 가지고 있었고 나는앤서니의 대답, 약간의 비틀림이 있습니다.

diff를 강제로 종료시키는 일부 하드웨어 오류(예: 입력/출력 오류)의 경우 그의 대답을 직접 적용하면 실패합니다.

나는 그의 대답을 다음과 같이 정리했습니다.이 답변, 그리고 이를 모두 다음과 같이 입력합니다.

find /path/to/original -type f -exec bash -c 'diff -rq --no-dereference "$@" "/path/to/destination/$(sed -r "s/^.*(<first-common-ancestor>.*)$/\1/g" <<<"$@")"' bash {} \;
  • /path/to/original복사한 원본 디렉터리의 경로로 바꾸세요 .
  • /path/to/destination복사한 대상 디렉터리의 경로로 바꿉니다 .
  • <first-common-ancestor>둘 사이의 공통 조상 디렉터리로 바꿉니다 . 예: /media/foo/bar에서 로 복사 중이므로 복사 작업이 완료된 후 의 디렉터리는 /media/test/dst/입니다 . 최초의 공통 조상이 여기에 있습니다. 아래의 모든 파일은 동일한 상대 경로를 갖기 때문입니다.dstbarbarbar

몇 가지 참고사항:

  • 및 부분 bash -cbash {}파일 이름을 안전하게 대체하기 위한 것입니다. 가능한 공격(예: 권한 상승)으로 인해 피해를 입지 않도록 안전한 편에 서십시오.
  • 발견된 파일의 절대경로를 제거하고 상대경로만 사용하는 부분 sed입니다(사용하는 것과 다름 execdir). 이것이 어떻게 유용한지 확실하지 않다면 제거하고 오류 메시지를 확인해보세요 :)
  • <<<변수를 읽을 파일의 경로로 읽는 대신 문자열로 읽는 것입니다 .

관련 정보