Chtěl bych komprimovat textový soubor pomocí nástroje příkazového řádku gzip při zachování původní soubor. Ve výchozím nastavení spuštěním následujícího příkazu

gzip file.txt 

dojde k úpravě tohoto souboru a přejmenování file.txt.gz. místo tohoto chování bych chtěl mít tento nový komprimovaný soubor v navíc k existujícímu file.txt. Prozatím k tomu 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á mi tu možnost chyběla?

Komentáře

  • Je to proto, že gzip komprimuje daný soubor a vytvoří nový soubor. Komprese znamená mačkání původního souboru a jeho nahrazení novým. Vaše možnost " -c " výslovně říká gzip, aby jej uložil pod jiným jménem. Proto ' proto to funguje
  • @SHW ' jsem nedostal váš komentář …?
  • @ManuelSelva po zkomprimování původního souboru již ' s není potřeba, myslím, že to byl design.
  • Proč gzip / gunzip udělejte to ve výchozím nastavení , když žádný jiný unixový nástroj to nedělá je mimo mě.

odpověď

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

S jakoukoli verzí můžete použít přesměrování prostředí jako v:

gzip < file > file.gz 

Pokud není uvedeno jakýkoli argument, gzip přečte jeho standardní vstup, zkomprimuje jej a zapíše komprimovanou verzi na standardní výstup. Jako bonus, při použití přesměrování prostředí se nemusíte starat o soubory nazývá se "--help" nebo "-" (ten druhý stále což je problém pro gzip -c --).

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

Významný rozdíl ve srovnání s gzip -k je však v tom, že nebude žádný pokus o kopírování metadat file „(vlastnictví, oprávnění, doba modifikace, název nekomprimovaného souboru) do file.gz.

Také pokud file.gz již existoval, bude jej potichu přepsat, pokud ve svém shellu nezapnete možnost noclobber (s set -o noclobber například v skořápkách POSIX).

Komentáře

  • Tím se řeší specifika OP ' s otázka a odpovídá ge neral question " Jak říct gzip, aby si ponechal původní soubor ". Velmi užitečné a užitečnější než -c.
  • Všimněte si, že < a > ve skutečnosti mají být zadány do příkazu a nepředstavují zástupný symbol pro název souboru
  • Co ' je -k možnost? Nelze ' jej najít na manuálových stránkách, např. tato verze zde linux.die.net/man/1/gzip . Také to vypadá, že gzip ve výchozím nastavení zkopíruje metadata souboru ' s.
  • @ flow2k, že ' s odkaz na odpověď don_cristi '.
  • @St é phaneChazelas Také na gzip verze 1.4. cat file | gzip > file.gz

Odpověď

Všimněte si, že nedávno (červen 2013 ) vydáno gzip-1.6 " přijímá –keep Možnost (-k), pro konzistenci s nástroji jako xz, lzip a bzip2. Díky této možnosti již gzip při kompresi nebo dekomprimaci " neodstraní pojmenované vstupní soubory.

Výňatek z hlavní stránky:

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

Takže od 1.6 můžete použít -k nebo --keep zachovat původní soubor:

gzip -k -- "$file" 

(upozorňujeme, že nefunguje, pokud $file je - (což gzip interpretuje ve smyslu stdin místo skutečného souboru s názvem -), v takovém případě jej musíte změnit na ./-)

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

Komentáře

  • Geez. RHEL6 přichází pouze se zipem 1.3.12 v základně …
  • Funguje to na Mac / OS X 🙂 (což je BSD)
  • Existuje mnoho standardních distribucí, které nepoužívají > = 1.6 už? Zajímá vás, zda je třeba odpověď aktualizovat
  • K čemu je " – "? Myslím, že soubor gzip -k " " funguje dobře.
  • @notilas viz unix.stackexchange.com/q/11376/22142

Odpověď

Z dokumentace se zdá, že neexistuje možnost vytvořit kopii souboru.

Můžete definovat funkci shellu

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

a poté

gzipkeep file.txt 

Komentáře

  • Upozorňujeme, že pokud je soubor -, musíte to nazvat jako gzipkeep ./-.
  • Toto je nejlepší řešení pro skripty IMO, protože si můžete být jisti, že výstupní soubor > "$1.gz" bude existovat přesně tak, jak je uvedeno. Kromě toho můžete v případě potřeby zadat i jiné jméno.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *