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
). 이것이 무엇인지 확실하지 않다면 제거하고 오류 메시지를 확인해보세요 :) <<<
변수를 읽을 파일의 경로로 읽는 대신 문자열로 읽습니다 .