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를 실행하면 차이점이 "수정"됩니다.c
s
-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/
입니다 . 최초의 공통 조상이 여기에 있습니다. 아래의 모든 파일은 동일한 상대 경로를 갖기 때문입니다.dst
bar
bar
bar
몇 가지 참고사항:
- 및 부분
bash -c
은bash {}
파일 이름을 안전하게 대체하기 위한 것입니다. 가능한 공격(예: 권한 상승)으로 인해 피해를 입지 않도록 안전한 편에 서십시오. - 발견된 파일의 절대경로를 제거하고 상대경로만 사용하는 부분
sed
입니다(사용하는 것과 다름execdir
). 이것이 어떻게 유용한지 확실하지 않다면 제거하고 오류 메시지를 확인해보세요 :) <<<
변수를 읽을 파일의 경로로 읽는 대신 문자열로 읽는 것입니다 .