나는 종종 서버에서 로컬 컴퓨터로 전송하려는 큰 디렉터리를 가지고 있습니다. 나는 일반적으로 재귀 scp
나 rsync
디렉터리 자체를 사용하는 대신 디렉터리를 먼저 사용한 다음 이를 전송합니다 .tar
gzip
최근에 이것이 실제로 작동하는지 확인하고 싶어서 동일한 소스 디렉토리에서 독립적으로 생성된 두 개의 아카이브 tar
에 대해 md5sum을 실행했습니다 . gzip
놀랍게도 MD5 해시는 다릅니다. 이 일을 두 번 더 했는데 늘 새로운 가치였어요. 왜 이 결과가 표시되나요? 동일한 버전의 GNU tar를 사용하여 tar 및 gzipped 디렉토리가 정확히 동일한 방식으로 생성됩니까? 동일해야 하지 않습니까?
명확성을 위해 소스 디렉터리와 대상 디렉터리가 있습니다. 대상 디렉토리에는 dir1과 dir2가 있습니다. 나는 뛰고있어:
tar -zcvf /destination/dir1/source.tar.gz source && md5sum /destination/dir1/source.tar.gz >> md5.txt
tar -zcvf /destination/dir2/source.tar.gz source && md5sum /destination/dir2/source.tar.gz >> md5.txt
이 작업을 수행할 때마다 md5sum에서 다른 결과가 나타납니다. Tar는 오류나 경고를 생성하지 않습니다.
답변1
보아하니 당신이 물린 것 같군요.gzip
타임스탬프;이를 방지하려면 다음을 실행하세요.
GZIP=-n tar -zcvf ...
완전히 재현 가능한 타르볼을 얻으려면 다음도 적용해야 합니다.정렬순서 사용tar
:
GZIP=-n tar --sort=name -zcvf ...
tar
귀하의 버전이 이를 지원하지 않는 경우 --sort
대신 다음을 사용하십시오.
find source -print0 | LC_ALL=C sort -z | GZIP=-n tar --no-recursion --null -T - -zcvf ...
답변2
Mac에서는 @stephen-kitt의 답변이 작동하지 않았고 이유는 확실하지 않았지만 gzip을 tar 명령에서 분리하면 동일한 해시가 생성되기 시작했습니다. 이것이 내가 끝내는 것입니다 :
outputpath="$(pwd)/folder_to_zip"
find "$outputpath" -print0 | LC_ALL=C sort -z | tar -s "#$outputpath/##" --no-recursion --null -T - -cf - | gzip -n > "$outputpath.tar.gz" && md5 "$outputpath.tar.gz"