Почему сжатие файла в stdin приводит к меньшему выводу, чем тот же файл, указанный в качестве аргумента?

13

Когда я делаю:

# gzip -c foo > foo1.gz 
# gzip < foo > foo2.gz

Почему в foo2.gzконечном итоге меньше, чем foo1.gz?

MichalH
источник

Ответы:

19

Потому что он сохраняет имя файла и временную метку, так что он может попытаться восстановить оба после того, как вы распакуете его позже. Поскольку в вашем втором примере fooдано значение gzipvia <stdin>, он не может хранить информацию о имени файла и метке времени.

Из справочной страницы:

   -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 com-
          pressed 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 --name
          When compressing, always save the original file name and time stamp; this is the default. When decompressing, restore the original
          file name and time stamp if present. This option is useful on systems which have a limit on file name  length  or  when  the  time
          stamp has been lost after a file transfer.

Я воссоздал проблему здесь:

[root@xxx601 ~]# cat /etc/fstab > file.txt
[root@xxx601 ~]# gzip < file.txt > file.txt.gz
[root@xxx601 ~]# gzip -c file.txt > file2.txt.gz
[root@xxx601 ~]# ll -h file*
-rw-r--r--. 1 root root  465 May 17 19:35 file2.txt.gz
-rw-r--r--. 1 root root 1.2K May 17 19:34 file.txt
-rw-r--r--. 1 root root  456 May 17 19:34 file.txt.gz

В моем примере file.txt.gzэто эквивалент вашего foo2.gz. Использование -nопции отключает это поведение, когда в противном случае он имел бы доступ к информации:

[root@xxx601 ~]# gzip -nc file.txt > file3.txt.gz
[root@xxx601 ~]# ll -h file*
-rw-r--r--. 1 root root  465 May 17 19:35 file2.txt.gz
-rw-r--r--. 1 root root  456 May 17 19:43 file3.txt.gz
-rw-r--r--. 1 root root 1.2K May 17 19:34 file.txt
-rw-r--r--. 1 root root  456 May 17 19:34 file.txt.gz

Как вы можете видеть выше, размеры файлов для file.txtи file3.txtсовпадают, так как они теперь опускают имя и дату.

Bratchley
источник