압축 된 .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

좋아, 그래서 내가 마침내 내가 원하는대로 물건을 얻는 방법을 발견했다고 생각해. tar 과 gzip 별도로 (나는 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.