Як сказати gzip зберегти оригінальний файл?


210

Я хотів би стиснути текстовий файл за допомогою інструменту командного рядка gzip, зберігаючи вихідний файл. За замовчуванням виконується наступна команда

gzip file.txt

призводить до зміни цього файлу та перейменування його file.txt.gz. замість такої поведінки я хотів би мати цей новий стислий файл на додаток до існуючого file.txt. Поки я використовую наступну команду для цього

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

Це працює, але мені цікаво, чому немає більш простого рішення зробити таке спільне завдання? Можливо, я пропустив варіант, роблячи це?


3
Це тому, що gzip стискає даний файл і створює новий файл. Стиснення означає видавити оригінальний файл і замінити його новим. Ваша опція "-c" прямо повідомляє gzip, щоб зберегти її з іншим ім'ям. Ось чому це працює
SHW

@SHW Я не отримав ваш коментар ...?
Мануель Сельва

@ManuelSelva, коли оригінальний файл стискається, він більше не потрібен, я думаю, це було дизайном.
ромашка

2
Чому gzip / gunzip роблять це за замовчуванням, коли жоден інший інструмент Unix не робить цього , крім мене.
Матін Ульхак

Відповіді:


247

Для GNU gzip1.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метадані 's (право власності, дозволи, час модифікації, ім'я нестисненого файлу) до file.gz.

Крім того, якщо він file.gzвже існував, він буде мовчки змінювати його, якщо ви не включили noclobberпараметр у своїй оболонці ( set -o noclobberнаприклад, у оболонках POSIX).


4
Тепер це стосується специфіки питання ОП та відповідає на загальне запитання "Як сказати gzip, щоб зберегти вихідний файл". Дуже зручно і корисніше -c.
Codewaggle

8
Зауважте, що <і> насправді повинні бути введені в команду і не представляють заповнювача для імені файлу
Gaurav Gupta,

Який -kваріант? Не вдалося знайти його на сторінках man, наприклад, ця версія тут linux.die.net/man/1/gzip . Крім того, схоже, що gzip за замовчуванням копіює метадані файлу.
flow2k

1
@ flow2k, це посилання на відповідь don_cristi.
Стефан Шазелас

ах, я бачу це на своїх макосах, але шкода, що це не на RHEL, ані на Ubuntu. Дякую.
flow2k

138

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

Уривок зі сторінки чоловіка:

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

Отже, 1.6ви можете використовувати -kабо --keepзберігати оригінальний файл:

gzip -k -- "$file"

(зауважте, що він не працює, якщо $fileє -(що gzipінтерпретує як значення stdin замість фактично названого файлу -); у цьому випадку вам потрібно змінити його на ./-)

Цей варіант був вперше запроваджений при впровадженні FreeBSDgzip (у FreeBSD 7.0 у 2007 р.) На відповідність bzip2. Це gzipзасновано на переписуванні GNU gzipвід NetBSD. -kВаріант в кінці кінців зробив це тому до NetBSD в 2010 році .


10
Гез. RHEL6 поставляється лише з блискавкою 1.3.12 в базі ...
Ніколас Толлі Коттрелл

Це працює на Mac / OS X :) (що є BSD)
пауль

Чи існує багато стандартних дистрибутивів, які більше не використовують> = 1.6? Цікаво, чи потрібна оновлення відповіді
MichaelChirico

Для чого "-"? Я думаю, що gzip -k "файл" працює чудово.
notilas

3
@notilas дивіться unix.stackexchange.com/q/11376/22142
don_crissti

30

З документації видно, що немає можливості створити копію файлу.

Ви можете визначити функцію оболонки

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

і потім

gzipkeep file.txt

2
Зауважте, що якщо файл є -, ви повинні викликати його як gzipkeep ./-.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.