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

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

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

/.options 에 주의하세요 .

  • -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. 세 번째 c나 네 번째 열에 차이가 있으면 s데이터가 심하게 손상된 것입니다. 다른 권한, 소유자 또는 타임스탬프와 같은 다른 플래그는 덜 중요할 수 있습니다. 모든 파일이 "누락"으로 표시되면 비교를 위해 올바른 디렉터리를 제공하지 않았을 수 있습니다. 확실하다면 해당 -n플래그 없이 rsync를 실행하면 차이가 "수정"됩니다.

답변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/복사 dst작업이 완료되면 디렉토리가 입니다 bar. bar아래의 모든 파일은 bar동일한 상대 경로를 갖기 때문에 첫 번째 공통 조상이 여기에 있습니다 .

몇 가지 참고사항:

  • bash -c섹션은 bash {}권한 상승과 같은 가능한 공격으로부터 안전하도록 파일 이름을 안전하게 대체하는 데 사용됩니다.
  • sed부분은 발견된 파일의 절대경로를 제거하고 상대경로만 사용하는 것입니다(이것은 를 사용하는 것과 다릅니다 execdir). 이것이 무엇인지 확실하지 않다면 제거하고 오류 메시지를 확인해보세요 :)
  • <<<변수를 읽을 파일의 경로로 읽는 대신 문자열로 읽습니다 .

관련 정보