Jeg vil komprimere en tekstfil ved hjelp av gzip kommandolinjeverktøy mens holder originalfilen. Som standard kjører du følgende kommando
gzip file.txt
endrer denne filen og omdøper den file.txt.gz
. i stedet for denne oppførselen vil jeg ha denne nye komprimerte filen i tillegg til den eksisterende file.txt
. For nå bruker jeg følgende kommando for å gjøre det
gzip -c file.txt > file.txt.gz
Det fungerer, men jeg lurer på hvorfor det ikke er noen enklere løsning å gjøre en så vanlig oppgave? Kanskje jeg savnet muligheten til å gjøre det?
Kommentarer
- Dette er fordi gzip komprimerer den gitte filen og oppretter en ny fil. Komprimering betyr å klemme originalfilen og erstatte den med en ny. " -c " alternativet forteller eksplisitt gzip om å lagre det med et annet navn. At ' derfor fungerer det
- @SHW Jeg fikk ikke ' ikke kommentaren din …?
- @ManuelSelva når originalfilen er komprimert, er den ' ikke lenger nødvendig, jeg antar at det var designet.
- Hvorfor gzip / gunzip gjør dette som standard når ingen andre unix-verktøy gjør dette er utenfor meg.
Svar
For GNU gzip
1.6 eller nyere, FreeBSD og derivater eller nyere versjoner av NetBSD, se don_cristis svar .
Med hvilken som helst versjon kan du bruke shell-omdirigeringer som i:
gzip < file > file.gz
Når ikke gitt ethvert argument, gzip
leser standardinngangen, komprimerer den og skriver den komprimerte versjonen til standardutgangen. Som en bonus, når du bruker shell-omdirigeringer, trenger du ikke å bekymre deg for filer kalt "--help"
eller "-"
(den siste fortsatt å være et problem for gzip -c --
).
En annen fordel i forhold til gzip -c file > file.gz
er at hvis file
kan ikke åpnes, kommandoen mislykkes uten å opprette en tom file.gz
(eller overskrive en eksisterende file.gz
) og uten å kjøre gzip
i det hele tatt.
En betydelig forskjell sammenlignet med gzip -k
er imidlertid at det ikke vil være noe forsøk på kopiere file
«s metadata (eierskap, tillatelser, endringstid, navn på ukomprimert fil) til file.gz
.
Også hvis file.gz
allerede eksisterte, vil den stille overstyre den med mindre du har slått på noclobber
-alternativet i skallet ditt (med set -o noclobber
for eksempel i POSIX-skjell).
Kommentarer
- Dette adresserer nå detaljene til OP ' s spørsmål og svar på ge normal spørsmål " Hvordan fortelle gzip å beholde originalfilen ". Veldig praktisk og mer nyttig enn
-c
. - Merk at < og > skal egentlig skrives inn i kommandoen og representerer ikke en plassholder for filnavnet
- Hva ' er
-k
alternativ? Kunne ikke ' finne den på mansidene, f.eks. denne versjonen her linux.die.net/man/1/gzip . Det ser også ut som gzip kopierer filen ' s metadata som standard. - @ flow2k, at ' s lenken til don_cristi ' s svar.
- @St é phaneChazelas Arbeider også med gzip versjon 1.4.
cat file | gzip > file.gz
Svar
Merk at nylig (juni 2013 ) utgitt gzip-1.6
" godtar –keep (-k) alternativ, for konsistens med verktøy som xz, lzip og bzip2. Med dette alternativet fjerner gzip ikke lenger navngitte inndatafiler når du komprimerer eller dekomprimerer " .
Utdrag fra mannssiden:
-k --keep Keep (don"t delete) input files during compression or decompression.
Så fra 1.6
kan du bruke -k
eller --keep
for å beholde originalfilen:
gzip -k -- "$file"
(merk at den ikke fungerer hvis $file
er -
(som gzip
tolker som betyr stdin i stedet for den faktiske filen som heter -
), i så fall må du endre det til ./-
)
Det alternativet var først introdusert i FreeBSD-implementeringen av gzip
(i FreeBSD 7.0 i 2007) for konsistens med bzip2
. At gzip
er basert på en omskrivning av GNU gzip
av NetBSD. gjorde det til slutt tilbake til NetBSD i 2010 .
Kommentarer
- Geez. RHEL6 kommer bare med zip 1.3.12 i basen …
- Dette fungerer på Mac / OS X 🙂 (som er BSD)
- Er det mange standarddistroer som ikke bruker > = 1.6 lenger? Lurer på om svaret må oppdateres
- Hva er " – " til? Jeg synes gzip -k " fil " fungerer bra.
- @notilas se unix.stackexchange.com/q/11376/22142
Svar
Fra dokumentasjonen ser det ut til at det ikke er noe alternativ å lage en kopi av filen.
Du kan definere en skallfunksjon
gzipkeep() { if [ -f "$1" ] ; then gzip -c -- "$1" > "$1.gz" fi }
og deretter
gzipkeep file.txt
Kommentarer
- Merk at hvis filen er
-
, du må kalle det somgzipkeep ./-
. - Dette er den beste løsningen for IMO-skript, da du kan være sikker på at utdatafilen
> "$1.gz"
vil eksistere akkurat som spesifisert. Videre kan du også spesifisere et annet navn hvis behovet skulle oppstå.