Почему делает gzip на выводе tar, всегда приводят к различным результатам?

То, что я ожидаю от двух команд, которые всегда производят тот же вывод самостоятельно, является ими, чтобы всегда произвести тот же вывод, когда оно вставляется в конвейер, но по-видимому дело обстоит не так для tar | gzip:

~/test$ ls
~/test$ dd if=/dev/urandom of=file bs=10000000 count=1
1+0 records in
1+0 records out
10000000 bytes (10 MB) copied, 0,877671 s, 11,4 MB/s // Creating a 10MB random file
~/test$ tar cf file.tar file // Archiving the file in a tarball
~/test$ tar cf file1.tar file // Archiving the file again in another tarball
~/test$ cmp file.tar file1.tar // Comparing the two output files
~/test$ gzip -c file > file.gz // Compressing the file with gzip
~/test$ gzip -c file > file1.gz // Compressing the file again with gzip
~/test$ cmp file.gz file1.gz // Comparing the two output files
~/test$ tar c file | gzip > file.tar.gz // Archiving and compressing the file
~/test$ tar c file | gzip > file1.tar.gz // Archiving and compressing the file again
~/test$ cmp file.tar.gz file1.tar.gz // Comparing the output files
file.tar.gz file1.tar.gz differ: byte 5, line 1 // File differs at byte 5
~/test$ cmp -i 5 file.tar.gz file1.tar.gz // Comparing the output files after byte 5
~/test$ 

Добавление к этому, даже tar cfz file.tar file самостоятельно всегда производит различные выводы:

~/test$ tar cfz file2.tar file // Archiving and compressing the file
~/test$ tar cfz file3.tar file // Archiving and compressing the file again
~/test$ cmp file2.tar.gz file3.tar.gz // Comparing the output files
file2.tar.gz file3.tar.gz differ: byte 5, line 1 // File differs at byte 5
~/test$ cmp -i 5 file2.tar.gz file3.tar.gz // Comparing the output files after byte 5
~/test$ 

В то время как разделение конвейера наконец производит вывод, который имеет смысл:

~/test$ gzip -c file.tar > file4.tar.gz
~/test$ gzip -c file.tar > file5.tar.gz
~/test$ cmp file4.tar.gz file5.tar.gz 
~/test$ 

Похоже, что бы ни случилось происходит только когда tarвывод передается по каналу непосредственно в gzip.

Каково объяснение этого поведения?

6
задан 15 April 2015 в 22:20

2 ответа

Заголовок для получающегося gzip файла отличается в зависимости от того, как это называют.

Gzip пытается хранить некоторую информацию источника в получающемся заголовке файла. Когда обращено нормальные файлы, это включает имя файла источника по умолчанию и метку времени, которую это получает из исходного файла.

, Когда это сделано сжать данные, переданные по каналу до него, источник не так легок как с нормальным файлом, таким образом, это обращается к различному именованию и соглашению метки времени.

Для доказательства это пытается добавить-n параметрический усилитель к незаконным строкам в примере как...

~/temp$ tar c file | gzip -n > file1.tar.gz
~/temp$ tar c file | gzip -n > file.tar.gz
~/temp$ cmp file.tar.gz file1.tar.gz

Теперь файлы идентичны снова...

От man gzip...

   -n --no-name
          When  compressing,  do  not save the original file name and time
          stamp by default. (The original name is always saved if the name
          had  to  be  truncated.)  When decompressing, do not restore the
          original file name if present (remove only the gzip suffix  from
          the  compressed  file name) and do not restore the original time
          stamp if present (copy it from the compressed file). This option
          is the default when decompressing.

, Таким образом, различием является действительно исходная информация об имени файла и метке времени, которая выключена-n параметрическим усилителем.

9
ответ дан 23 November 2019 в 07:22

Файлы Gzip включают метку времени. При создании двух gzip файлов в разное время они будут отличающийся ко времени создания, не содержанием.

5
ответ дан 23 November 2019 в 07:22

Другие вопросы по тегам:

Похожие вопросы: