Как сообщить gzip о сохранении исходного файла?

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

gzip file.txt 

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

 gzip -c file.txt > file.txt.gz 

Это работает, но мне интересно, почему нет простого решения для выполнения такой общей задачи? Может, я пропустил этот вариант?

3 Solutions collect form web for “Как сообщить gzip о сохранении исходного файла?”

Для GNU gzip 1.6 или выше, FreeBSD и производные или последние версии NetBSD, см . Ответ don_cristi .

С любой версией вы можете использовать перенаправления оболочки, как в:

 gzip < file > file.gz 

Когда не задан какой-либо аргумент, 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).

Обратите внимание, что в недавно выпущенном (июнь 2013 г.) выпуске gzip-1.6 «принимается опция -keep (-k) для согласованности с такими инструментами, как xz, lzip и bzip2. С помощью этой опции gzip больше не удаляет именованные входные файлы при сжатии или распаковке " .

Выдержка из страницы руководства:

  -k --keep Keep (don't delete) input files during compression or decompression. 

Итак, с 1.6 , вы можете использовать -k или --keep чтобы сохранить исходный файл:

 gzip -k -- "$file" 

(обратите внимание, что он не работает, если $file is - (который gzip интерпретирует как значение stdin вместо фактического имени файла - ), и в этом случае вы должны изменить его на ./- )

Этот вариант был впервые представлен в реализации FreeBSD gzip (в FreeBSD 7.0 в 2007 году) для обеспечения совместимости с bzip2 . Этот gzip основан на перезаписи GNU gzip NetBSD. Опция -k конце концов вернула NetBSD в 2010 году .

Из документации кажется, что нет возможности создать копию файла.

Вы можете определить функцию оболочки

 gzipkeep() { if [ -f "$1" ] ; then gzip -c -- "$1" > "$1.gz" fi } 

а потом

 gzipkeep file.txt 
  • Как создать детерминированный tar.gz с помощью git-архива?
  • лучший способ разделить огромные файлы на основе поля, когда awk слишком медленный
  • Оценить размер извлеченных файлов перед извлечением архива `tar.gz`?
  • Как конвертировать существующие файлы gz (gzip) в rsyncable
  • Unix bash скрипт проверяет пустые файлы gz
  • Терминал замерзает после использования tar или gz
  • Сжатие папки, но не сжимать определенные типы файлов, а включать их в файл gz
  • В чем разница между gzip и compress?
  • gzip-файлы с кошкой и из трубы дают разные результаты
  • Ускорение работы zgrep на многоядерном компьютере
  • Как искать текст в сжатых файлах и получать только имя файла
  • Linux и Unix - лучшая ОС в мире.