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 jakogzipkeep ./-
. - 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.