it-swarm-eu.dev

Jak říct gzipu, aby zachoval původní soubor?

Chtěl bych komprimovat textový soubor pomocí nástroje příkazového řádku gzip, zatímco držení původní soubor. Ve výchozím nastavení je spuštěn následující příkaz

gzip file.txt

má za následek úpravu tohoto souboru a jeho přejmenování file.txt.gz. místo tohoto chování bych chtěl mít tento nový komprimovaný soubor v kromě k existujícímu file.txt. Pro tuto chvíli používám následující příkaz

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

Funguje to, ale zajímalo by mě, proč neexistuje jednodušší řešení pro provedení takového společného úkolu? Možná jsem to zmeškal?

221
Manuel Selva

Pro GNU gzip 1.6 nebo vyšší, FreeBSD a deriváty nebo nejnovější verze NetBSD viz odpověď don_cristi .

S jakoukoli verzí můžete přesměrovat Shell jako v:

gzip < file > file.gz

Pokud není uveden žádný argument, gzip přečte jeho standardní vstup, zkomprimuje jej a zapíše komprimovanou verzi na svůj standardní výstup. Jako bonus se při používání přesměrování Shell nemusíte starat o soubory s názvem "--help" nebo "-" (ten druhý je stále problémem pro gzip -c --).

Další výhoda oproti gzip -c file > file.gz je to, že pokud file nelze otevřít, příkaz se nezdaří bez vytvoření prázdného file.gz (nebo přepsání existujícího file.gz) a bez spuštění gzip vůbec.

Významný rozdíl ve srovnání s gzip -k je však to, že se nepokusí zkopírovat metadata file (vlastnictví, oprávnění, čas změny, název nekomprimovaného souboru) do file.gz.

Také pokud file.gz již existovalo, bude tiše přepsáno, pokud v Shell nezapnete volbu noclobber (s set -o noclobber například v pouzdrech POSIX).

254
Stéphane Chazelas

Všimněte si, že nedávno vydané (červen 2013) vydané gzip-1.6 "přijímá volbu --keep (-k) pro konzistenci s nástroji jako xz, lzip a bzip2. S touto volbou již gzip při komprimaci neodstraňuje pojmenované vstupní soubory. nebo dekomprimovat “.

Výňatek z manuálové stránky:

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

Takže od 1.6, Můžeš použít -k nebo --keep zachovat původní soubor:

gzip -k -- "$file"

(Všimněte si, že to nefunguje, pokud $file je - (které gzip interpretuje ve smyslu stdin místo skutečného souboru s názvem -), v tom případě ji musíte změnit na ./-)

Tato možnost byla poprvé představena v implementaci FreeBSD gzip (ve FreeBSD 7.0 v roce 2007) kvůli konzistenci s bzip2. Že gzip je založeno na přepsání GNU gzip od NetBSD. -k možnost se nakonec v roce 2010 vrátila zpět na NetBSD .

149
don_crissti

Z dokumentace se zdá, že není možné vytvořit kopii souboru.

Můžete definovat funkci Shell

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

a pak

gzipkeep file.txt
30
Matteo