Ik zou graag een tekstbestand willen comprimeren met gzip command line tool terwijl het originele bestand. Het standaard uitvoeren van het volgende commando
gzip file.txt
resulteert in het wijzigen van dit bestand en het hernoemen van file.txt.gz
. in plaats van dit gedrag zou ik dit nieuwe gecomprimeerde bestand graag in add willen hebben aan het bestaande file.txt
. Voorlopig gebruik ik daarvoor het volgende commando
gzip -c file.txt > file.txt.gz
Het werkt, maar ik vraag me af waarom er geen eenvoudigere oplossing is om zon veelvoorkomende taak uit te voeren? Misschien heb ik de optie om dat te doen gemist?
Reacties
- Dit komt doordat gzip het gegeven bestand comprimeert en een nieuw bestand aanmaakt. Compressie betekent dat het originele bestand wordt samengedrukt en door een nieuw wordt vervangen. Uw " -c " optie vertelt gzip expliciet om het op te slaan met een andere naam. Dat ' is waarom het werkt
- @SHW Ik heb ' je commentaar niet gekregen …?
- @ManuelSelva zodra het originele bestand is gecomprimeerd, ' is niet langer nodig, ik denk dat dat het ontwerp was.
- Waarom gzip / gunzip doe dit standaard wanneer geen enkele andere Unix-tool dit doet is mij een raadsel.
Antwoord
Voor GNU gzip
1.6 of hoger, FreeBSD en afgeleiden of recente versies van NetBSD, zie don_cristi “s antwoord .
Met elke versie kunt u shell-omleidingen gebruiken zoals in:
gzip < file > file.gz
Indien niet opgegeven elk argument, gzip
leest zijn standaardinvoer, comprimeert het en schrijft de gecomprimeerde versie naar zijn standaarduitvoer. Als bonus, wanneer je shell-omleidingen gebruikt, hoef je je geen zorgen te maken over bestanden genaamd "--help"
of "-"
(die laatste nog steeds een probleem vormen voor gzip -c --
).
Een ander voordeel ten opzichte van gzip -c file > file.gz
is dat als file
kan “niet worden geopend, de opdracht zal mislukken zonder een lege file.gz
te maken (of een bestaande file.gz
te overschrijven) en zonder gzip
helemaal uit te voeren.
Een significant verschil met gzip -k
is echter dat er geen poging zal worden gedaan om het kopiëren van de metagegevens van file
“(eigendom, rechten, wijzigingstijd, naam van niet-gecomprimeerd bestand) naar file.gz
.
Ook als file.gz
al bestond, zal het deze stilletjes overschrijven, tenzij je de optie noclobber
in je shell hebt ingeschakeld (met set -o noclobber
bijvoorbeeld in POSIX-shells).
Reacties
- Dit gaat nu in op de specifieke kenmerken van het OP ' s vraag en beantwoordt de ge algemene vraag " Hoe vertel ik gzip om het originele bestand te behouden ". Erg handig en handiger dan
-c
. - Merk op dat de < en > worden eigenlijk in het commando getypt en vertegenwoordigen geen tijdelijke aanduiding voor de bestandsnaam
- Wat ' is het
-k
optie? Kon ' niet vinden in de man-paginas, bijv. deze versie hier linux.die.net/man/1/gzip . Het lijkt er ook op dat gzip het bestand ' s standaard metadata kopieert. - @ flow2k, dat ' s de link naar don_cristi ' s antwoord.
- @St é phaneChazelas Werkt ook aan gzip versie 1.4.
cat file | gzip > file.gz
Antwoord
Merk op dat de recente (juni 2013 ) vrijgegeven gzip-1.6
" accepteert de – behouden (-k) optie, voor consistentie met tools zoals xz, lzip en bzip2. Met deze optie verwijdert gzip niet langer benoemde invoerbestanden bij het comprimeren of decomprimeren van " .
Fragment uit de man-pagina:
-k --keep Keep (don"t delete) input files during compression or decompression.
Dus vanaf 1.6
kun je -k
of --keep
om het originele bestand te behouden:
gzip -k -- "$file"
(merk op dat het niet “werkt als $file
-
(die gzip
interpreteert als stdin in plaats van het eigenlijke bestand -
), in welk geval je het moet veranderen in ./-
)
Die optie was voor het eerst geïntroduceerd in de FreeBSD-implementatie van gzip
(in FreeBSD 7.0 in 2007) voor consistentie met bzip2
. Dat gzip
is gebaseerd op een herschrijving van GNU gzip
door NetBSD. De -k
optie maakte het uiteindelijk terug naar NetBSD in 2010 .
Reacties
- Geez. RHEL6 wordt alleen geleverd met zip 1.3.12 in basis …
- Dit werkt op Mac / OS X 🙂 (wat BSD is)
- Zijn er veel standaard distributies die geen > = 1.6 meer? Vraagt u zich af of het antwoord moet worden bijgewerkt.
- Waar is " – " voor? Ik denk dat gzip -k " file " prima werkt.
- @notilas zie unix.stackexchange.com/q/11376/22142
Antwoord
Uit de documentatie blijkt dat er geen optie is om een kopie van het bestand te maken.
Je kunt een shell-functie definiëren
gzipkeep() { if [ -f "$1" ] ; then gzip -c -- "$1" > "$1.gz" fi }
en dan
gzipkeep file.txt
Opmerkingen
- Merk op dat als het bestand , je moet het noemen als
gzipkeep ./-
. - Dit is de beste oplossing voor IMO-scripts, aangezien je er zeker van kunt zijn dat het outputbestand
> "$1.gz"
zal precies bestaan zoals gespecificeerd. Bovendien kunt u ook een andere naam opgeven als dat nodig mocht zijn.