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

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

gzip file.txt 

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

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

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

  • Добавить временную метку при записи файла
  • Как распечатать перед строк ключевого слова поиска с помощью grep в gz-файле?
  • Как я могу изменить первую строку большого файла gzip без распаковки всего этого?
  • Эффективно удалять файлы из больших .tgz
  • есть файл tempfile2.gz (проверен с помощью команды файла), но gunzip / gzip -d не работает
  • gzip * .txt vs gzip test.txt & gzip test2.txt &
  • массовые распаковки файлов gzip без расширения gz
  • Декомпрессия gzip-файла на месте
  • 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 
    Linux и Unix - лучшая ОС в мире.