Я хотел бы сжать текстовый файл с помощью инструмента командной строки gzip, сохранив исходный файл. По умолчанию выполняется следующая команда
gzip file.txt
приводит к изменению этого файла и переименованию его file.txt.gz
. вместо этого поведения я хотел бы иметь этот новый сжатый файл в дополнение к существующему file.txt
. Сейчас я использую следующую команду, чтобы сделать это
gzip -c file.txt > file.txt.gz
Это работает, но мне интересно, почему нет более простого решения для такой общей задачи? Может быть, я упустил возможность сделать это?
command-line
files
gzip
Мануэль Сельва
источник
источник
Ответы:
Для GNU
gzip
1.6 или выше, FreeBSD и производных или последних версий NetBSD, смотрите ответ don_cristi .В любой версии вы можете использовать перенаправления оболочки, как в:
Если аргумент не задан, он
gzip
читает его стандартный ввод, сжимает его и записывает сжатую версию в стандартный вывод. В качестве бонуса, при использовании перенаправлений оболочки вам не нужно беспокоиться о вызываемых файлах"--help"
или"-"
(этот последний по-прежнему остается проблемойgzip -c --
).Еще одним преимуществом
gzip -c file > file.gz
является то, что еслиfile
не удается открыть, команда не будет выполнена без создания пустогоfile.gz
(или перезаписи существующегоfile.gz
) и без выполненияgzip
вообще.Существенная разница по сравнению с
gzip -k
тем, что не будет попытки скопироватьfile
метаданные (владельца, разрешения, время модификации, имя несжатого файла) вfile.gz
.Также, если он
file.gz
уже существует, он будет автоматически переопределять его, если вы не включилиnoclobber
опцию в своей оболочке (set -o noclobber
например, в оболочках POSIX).источник
-c
.-k
вариант? Не удалось найти его на страницах руководства, например, здесь эта версия linux.die.net/man/1/gzip . Кроме того, похоже, что по умолчанию gzip копирует метаданные файла.Обратите внимание, что недавно выпущенная (июнь 2013 г.) «принимает опцию --keep (-k) для согласованности с такими инструментами, как xz, lzip и bzip2. С этой опцией gzip больше не удаляет именованные входные файлы при сжатии или распаковке» .
gzip-1.6
Выдержка из справочной страницы:
Таким образом,
1.6
вы можете использовать-k
или--keep
сохранить исходный файл:(обратите внимание, что он не работает, если
$file
есть-
(чтоgzip
интерпретирует как значение stdin вместо фактического вызываемого файла-
), в этом случае вы должны изменить его на./-
)Эта опция была впервые представлена в реализации FreeBSD
gzip
(во FreeBSD 7.0 в 2007 году) для обеспечения соответствияbzip2
. Этоgzip
основано на переписывании GNUgzip
NetBSD.-k
Вариант в конце концов сделал это назад к NetBSD в 2010 году .источник
Из документации кажется, что нет возможности создать копию файла.
Вы можете определить функцию оболочки
а потом
источник
-
, вы должны назвать его какgzipkeep ./-
.