[Mac, Linux] tar.gz 의 hash 값 다른 문제 Computer Tip

어떤 폴더가 있는데 이 폴더를 tar.gz 으로 묶고 앞축하여 
md5 (linux에서는 md5sum) 으로 그 무결성을 체크하려고 하였습니다.

우선 tar.gz 할 폴더를 살펴봅니다.

$ du -sh machine_learning_examples
 60M    machine_learning_examples

라고 60메가 짜리 폴더가 있습니다.

이 폴더를 foo.tgz 와 bar.tgz 라고 동일하게 압축해 보았습니다.

$ tar cfz foo.tgz machine_learning_examples
$ tar cfz bar.tgz machine_learning_examples
$ ls -l *.tgz
-rw-r--r--  1 moonchangchae  staff  43959157  6 29 09:08 bar.tgz
-rw-r--r--  1 moonchangchae  staff  43959157  6 29 09:07 foo.tgz

바이크 수도 모두 동일합니다.

그런데 이를 md5 (리눅스에서는 md5sum)로 
두 tgz 파일의 해쉬를 떠 보면,

$ md5 *.tgz
MD5 (bar.tgz) = 42862b2b2d53dc70cd16464ea08a46f2
MD5 (foo.tgz) = 9290fb46fdd923b7d8588010f6d407fb

아니 이럴 수가..
서로 틀린 것입니다.
할 때마다 틀리다면 해당 내용이 하나도 안 바뀌는데
어떻게 검증을 할 수 있겠습니까?

그런데, 이번에는 tar로만 동일한 작업을 해 보니,

$ tar cf foo.tar machine_learning_examples
$ tar cf bar.tar machine_learning_examples
$ ls -l *.tar
-rw-r--r--  1 moonchangchae  staff  62922752  6 29 09:12 bar.tar
-rw-r--r--  1 moonchangchae  staff  62922752  6 29 09:12 foo.tar

$ md5 *.tar
MD5 (bar.tar) = 6952d22ad2a96d3a1e1f18e83f449359
MD5 (foo.tar) = 6952d22ad2a96d3a1e1f18e83f449359

이라고 나옵니다.

음... 아마 tar로는 묶은 결과가 같이 나오는 것으로 보아 gzip이 무언가
다른 정보를 넣는다고 추정됩니다.

결국 찾아보니...
디폴트가 아닌 gzip으로 묶는 과정에

--no-name 이라는 옵션이 있는데...


gzip 메뉴얼을 확인하면, 압축할 때 기본적으로 파일 이름 및 묶은 시각을 같이 넣는다는 것입니다.

결국 tar로 묶고 gzip으로 압축을 할 때 --no-name 이라는 옵션을 주어 결과를 만들어 내면 되는데,
다음과 같이 합니다.

tar cf - {묶을 폴더} | gzip --no-name > {tgz파일명}

우선 tar로 묶을 때 cf - 는 생성을 하는데 그 결과를 stdout 으로 출력한다는 의미이고
이 결과를 파이프(|)를 통해 gzip의 stdin 이 되고 압축을 하는데
--no-name 옵션을 주어 stdout으로 출력시킵니다. 이것을 redirect (>) 시켜
tgz 파일을 생성시키는 것입니다.

따라서 다음과 같이

$ tar cf - machine_learning_examples | gzip --no-name > foo.tgz
$ tar cf - machine_learning_examples | gzip --no-name > bar.tgz
$ ls -l *.tgz
-rw-r--r--  1 moonchangchae  staff  43959157  6 29 09:17 bar.tgz
-rw-r--r--  1 moonchangchae  staff  43959157  6 29 09:17 foo.tgz

묶고 그 hash를 확인해 보면,

$ md5 *.tgz
MD5 (bar.tgz) = ca3320c6ccef1ad586d20d480f1cf402
MD5 (foo.tgz) = ca3320c6ccef1ad586d20d480f1cf402

이제사 제대로 된 tar.gz 결과를 얻었네요.

double check를 위해서

기존 압축할 폴더를 rename 시키고 다시 위에서 압축한 결과를
풀어 두 개의 폴더를 recursive diff를 시켜보았더니

$ diff -r machine_learning_examples machine_learning_examples2
$

(동일하면 아무런 출력도 하지 않습니다)

참고로 위의 폴더는 

$ find . -type d | wc -l
      49
$ find . -type f | wc -l
     305

49개의 하위 폴더와 305개의 파일로 구성되어 있는 일반
파일 구조 입니다.


어느 분께는 도움이 되셨기를...

덧글

댓글 입력 영역

구글애드텍스트