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 som gzipkeep ./-.
  • 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å.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *