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

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

gzip file.txt

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

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

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

172 голоса | спросил Manuel Selva 31 PM000000120000001531 2012, 12:47:15

3 ответа


212

Для 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).

ответил Stéphane Chazelas 19 WedEurope/Moscow2012-12-19T01:12:43+04:00Europe/Moscow12bEurope/MoscowWed, 19 Dec 2012 01:12:43 +0400 2012, 01:12:43
117

Обратите внимание, что недавно (июнь 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 есть - (который gzip интерпретирует как значение stdin вместо фактического файла с именем -), и в этом случае вы должны изменить его на ./-)

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

ответил don_crissti 14 J0000006Europe/Moscow 2013, 18:54:29
29

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

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

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

, а затем

gzipkeep file.txt
ответил Matteo 31 PM000000120000001531 2012, 12:54:15

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132