압축 된 .tar.gz 파일을 결정적으로 압축하기


3

나는 그들의 속성을 연구하기 위해 압축 파일의 일련의 재 압축을 수행하고자합니다.

처음에는 간단히 재 압축을 시도했습니다. .zip 루프에있는 파일 :

for f in $(seq 1 100)
do 
  zip $f.zip -9 -v $(($f-1)).zip
done

고정 된 것에서 시작 0.zip 파일, 나는이 줄을 다시 실행하면 처음 몇 파일을 제외한 모든 파일의 크기가 다르다는 것을 알았습니다. 조사가 끝나면 압축 파일의 타임 스탬프가 원인임을 알게되었습니다. 그런 다음 다시 압축하기 전에 타임 스탬프를 다시 설정합니다.

for f in $(seq 1 100)
do
  touch $(($f-1)).zip -t 200101010101
  zip $f.zip -9 -v $(($f-1)).zip
done

그리고 이번에는 압축을 사용하여 결정 론적 결과를 얻었습니다. zip. 그러나, tar 와 더불어 gzip 알고리즘은 여전히 ​​작동하지 않습니다. 내가 갈 때마다 :

for f in $(seq 1 100)
do
  touch $(($f-1)).tar.gz -t 200101010101
  tar cvfz $f.tar.gz $(($f-1)).tar.gz
done

나는 다른 파일 크기를 얻는다. 4.tar.gz ...까지 100.tar.gz. 왜 그런 일이 일어나고, 그런 일이 일어나지 않도록하려면 어떻게해야합니까?

답변:


3

증분 백업에 tar를 사용하려면 tar의 일부 버전은 파일이 아카이브에 추가되는 시간을 저장합니다. 테스트를 실행할 때마다 결과가 달라질 수 있으므로 결과가 비 결정적으로 보입니다.


GNU tar를 사용하고 있습니다. 증분 백업과 관련된 몇 가지 옵션을 시도했지만 결정 성있게 작동하지는 못했습니다. 나는 또한 설정을 시도했다. mtime 그러나 그것은 도움이되지 못했습니다. 내 버전의 타르에서 결정 론적 아카이브를 얻는 것이 불가능할 수도 있다는 것을 암시하고 있습니까? 아니면이 문제를 무시할 수있는 옵션이 있습니까?
anol

글쎄, 나는 아래에있는 길을 발견했다. 불행히도 증분 백업 설정은 도움이되지 못했지만 실제 동기를 이해하려고 노력했습니다. 문제는 gzip 부분 이었지만 tar 자체에 집중하고있었습니다 ...
anol

3

좋아, 그래서 내가 마침내 내가 원하는대로 물건을 얻는 방법을 발견했다고 생각해. targzip 별도로 (나는 GNU 도구 인 tar 1.26과 gzip 1.6 둘 다 사용하고있다.)

사용하는 경우 z ~ 안에있는 옵션 tar, 먼저 tar 파일을 만든 다음 즉시 사용합니다 gzip 파일을 만드는 타임 스탬프. 즉, 중간 파일의 타임 스탬프를 제어 할 수 없습니다. (보관할 원본 파일의 mtime을 변경하는 것 외에는 옵션을 찾을 수 없었습니다.) 따라서 .tar.gz 파일은 끝나지 않은 파일로 끝납니다. 결정 론적.

그러나 gzip없이 tar를 처음 사용하면 tar 파일의 타임 스탬프를 수정하십시오 ( touch 예를 들어) gzip을 사용하여 컴파일하면 결정적인 결과를 얻습니다.

덧붙여 말하면 2 단계 프로세스를 사용하는 결과 파일은 훨씬 작습니다 (z 옵션을 사용하여 tar를 사용할 때 ~ 1.2MB가 아닌 내 예제에서는 ~ 400KB). 이 작업은 tar + gzip과 gzip을 단독으로 사용하는 경우 기본 설정과 관련되어야합니다. 어쨌든 원본 파일이 비어 있었기 때문에 크기 축소가 의미가 있는지 확신 할 수 없습니다.

어쨌든 내 질문에 대한 짧은 대답은 다음과 같습니다.

  • 결정적인 결과를 얻을 수 있지만, tar와 gzip을 따로 사용하는 것은 가능합니다.

  • 사용시 결정 론적 결과를 얻는 것이 불가능 해 보입니다. tar -zgzip 압축 이전의 중간 tar 파일의 타임 스탬프로 인해. 이 타임 스탬프는 사용자가 제어 할 수 없습니다.


1

언급했듯이 tar 및 gzip 단계를 별도로 수행해야하지만 중간 파일은 필요하지 않지만 단순히 tar의 입력을 gzip으로 파이프하고 gzip에서 -n 옵션을 지정할 수 있습니다. 맨 페이지에서 :이 옵션은 파일 이름과 타임 스탬프가 출력 파일에 저장되는 것을 중지합니다.

tar cvf - /path/to/files | gzip -n > archive.tar.gz

위의 명령을 동일한 파일 집합에서 다른 시간에 두 번 실행하고 md5 합계를 확인하십시오. 두 개의 아카이브가 동일해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.