두 개의 동일한 폴더를 압축하면 다른 결과가 발생합니다.

두 개의 동일한 폴더를 압축하면 다른 결과가 발생합니다.

다음과 같이 구조와 내용이 동일한 두 개의 동일한 폴더가 있습니다.

folder_1
  hello.txt
  subfolder
    byebye.txt

folder_2
  hello.txt
  subfolder
    byebye.txt

tar.xz 형식으로 압축하면 파일 크기가 서로 다른 두 개의 서로 다른 아카이브가 생성됩니다(몇 바이트에 불과하지만 동일하지 않음).

$ cd folder_1 && tar -Jcf archive.tar.xz *
$ cd folder_2 && tar -Jcf archive.tar.xz *

나는 얻다:

folder_1/archive.tar.xz != folder_2/archive.tar.xz

물론 나나 그들이면 md5sumsha1sum개의 서로 다른 해시를 얻게 될 것입니다.

내 문제는 다음과 같습니다. 제공된 아카이브가 내 저장소에 있는 아카이브와 동일한지 확인해야 합니다. 해싱을 사용할 수 없고 파일 크기만 확인할 수도 없습니다.

tar.xz 대신 zip을 사용하면 zip이 항상 동일한 파일에서 동일한 아카이브를 생성하므로 문제가 없습니다. 왜 이런 일이 발생합니까? 그것을 방지할 수 있는 방법이 있나요?

답변1

좋아, ddnomad가 제공한 설명이 정확합니다. 타임스탬프에 관한 것입니다.

해결책은 다음과 같습니다.

--mtime='1970-01-01 00:00:00'tar 명령에 추가 :

tar --mtime='1970-01-01 00:00:00' -Jcf archive.tar.xz *

이렇게 하면 콘텐츠 타임스탬프가 고정된 값으로 강제 설정되어 동일한 아카이브가 생성됩니다.

답변2

동일한 디렉토리 트리의 두 타르볼이 서로 다른 데에는 여러 가지 이유가 있습니다. 다음이 있습니다:

  • 소유권, 타임스탬프 등과 같은 메타데이터는 다를 수 있습니다. 복사 가능한 tar 아카이브를 얻으려면 동일한 소유권, 권한 및 타임스탬프가 필요합니다. 모든 메타데이터를 복사했는지 확인하세요 . 파일 콘텐츠는 동일하고 메타데이터는 다른 경우 cp -a --attributes-only도움이 될 수 있습니다 . GNU tar를 사용하면 몇 가지 옵션을 사용하여 특정 속성을 무시할 수 있습니다.

    • --numeric-owner이름은 저장되지 않고 숫자로 된 사용자 및 그룹 ID만 저장됩니다.
    • --owner그리고 --group파일이 특정 사용자 및 그룹에 각각 기록되도록 강제합니다(예: --owner=0 --group=0모든 파일을 루트에 속하는 것으로 기록).
    • --set-mtime실제 타임스탬프 대신 특정 타임스탬프가 있는 모든 파일을 저장할 수 있습니다.
  • 파일이 저장되는 순서는 다를 수 있습니다. 대부분의 파일 시스템은 파일이 디렉토리에 나열되는 순서와 tar파일이 나타나는 대로 나열하는 순서를 구체적으로 보장하지 않습니다. (명령을 통해 볼 수 있습니다 ls -U.) GNU tar 1.28에는 새로운 옵션이 있습니다 --sort=name. 이전 버전이나 다른 구현을 사용하면 정렬된 파일 이름 목록을 작성하고 이를 tar에 전달하여 재현 가능한 파일 순서를 얻을 수 있습니다.

    find . -print0 | LC_ALL=C sort -z | tar --no-recursion -Jcf ../archive.tar.xz -T -
    

당신은 관심이 있을 수도 있습니다재현 가능한 빌드에 관한 데비안 위키 페이지.

답변3

모든 파일(폴더도 파일임)에는 타임스탬프가 내장되어 있습니다.

이러한 폴더 구조를 동시에 만들 수는 없다고 생각하므로 이러한 파일의 타임스탬프가 다릅니다.

따라서 아카이브 또는 해싱은 타임스탬프가 두 작업에 사용되는 파일의 일부이므로 다른 결과를 제공합니다.

이는 겉보기에 동일해 보이는 파일 구조의 차이입니다.

업데이트: 유사한 내용이 있는지 확인하면 실제로 이러한 파일의 내용을 확인하고 비교해야 할 것 같습니다.

관련 정보