Jeg vil gerne komprimere en tekstfil ved hjælp af gzip kommandolinjeværktøj, mens holder den originale fil. Som standard kører følgende kommando

gzip file.txt 

resulterer i at ændre denne fil og omdøbe den file.txt.gz. i stedet for denne adfærd vil jeg gerne have denne nye komprimerede fil i tilføjelse til den eksisterende file.txt. For nu bruger jeg følgende kommando til at gøre det

gzip -c file.txt > file.txt.gz 

Det virker, men jeg undrer mig over, hvorfor der ikke er nogen lettere løsning at udføre en sådan fælles opgave? Måske savnede jeg muligheden for at gøre det?

Kommentarer

  • Dette skyldes, gzip komprimerer den givne fil og opretter en ny fil. Kompression betyder at klemme originalfilen og erstatte den med en ny. Din " -c " giver udtrykkeligt besked til gzip om at gemme den med et andet navn. At ' derfor fungerer det
  • @SHW Jeg fik ikke ' ikke din kommentar …?
  • @ManuelSelva når den originale fil er komprimeret, er den ' ikke længere nødvendig, jeg antager, det var designet.
  • Hvorfor gzip / gunzip gør dette som standard når intet andet unix-værktøj gør dette er uden for mig.

Svar

For GNU gzip 1.6 eller derover, FreeBSD og derivater eller nyere versioner af NetBSD, se don_cristis svar .

Med en hvilken som helst version kan du bruge shell-omdirigeringer som i:

gzip < file > file.gz 

Når det ikke er givet ethvert argument gzip læser sin standardindgang, komprimerer den og skriver den komprimerede version til sin standardoutput. Som en bonus, når du bruger shell-omdirigeringer, behøver du ikke bekymre dig om filer kaldes "--help" eller "-" (sidstnævnte stadig at være et problem for gzip -c --).

En anden fordel i forhold til gzip -c file > file.gz er, at hvis file kan ikke åbnes, kommandoen mislykkes uden at oprette en tom file.gz (eller overskrive en eksisterende file.gz) og uden at køre gzip overhovedet.

En signifikant forskel i forhold til gzip -k er dog, at der ikke vil være noget forsøg på kopiering af file “s metadata (ejerskab, tilladelser, ændringstid, navn på ukomprimeret fil) til file.gz.

Hvis file.gz allerede eksisterede, tilsidesætter den det lydløst, medmindre du har slået noclobber til i din shell (med set -o noclobber for eksempel i POSIX-skaller).

Kommentarer

  • Dette løser nu specifikationerne for OP ' s spørgsmål og svarer på ge neralt spørgsmål " Hvordan man beder gzip om at beholde den originale fil ". Meget praktisk og mere nyttigt end -c.
  • Bemærk at < og > formodes faktisk at blive skrevet i kommandoen og repræsenterer ikke en pladsholder for filnavnet
  • Hvad ' er -k mulighed? Kunne ' ikke finde det på mandsiderne, f.eks. denne version her linux.die.net/man/1/gzip . Det ser også ud til, at gzip kopierer filen ' s metadata som standard.
  • @ flow2k, at ' s linket til don_cristi ' s svar.
  • @St é phaneChazelas Arbejder også med gzip version 1.4. cat file | gzip > file.gz

Svar

Bemærk, at det for nylig (juni 2013 ) frigivet gzip-1.6 " accepterer –keep (-k) mulighed for konsistens med værktøjer som xz, lzip og bzip2. Med denne indstilling fjerner gzip ikke længere navngivne inputfiler, når de komprimerer eller dekomprimerer " .

Uddrag fra mandsiden:

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

Så fra 1.6 kan du bruge -k eller --keep for at beholde den originale fil:

gzip -k -- "$file" 

(bemærk, at den ikke fungerer, hvis $file er - (som gzip fortolker som betydning stdin i stedet for den faktiske fil kaldet -), i hvilket tilfælde skal du ændre det til ./-)

Denne mulighed var først introduceret i FreeBSD-implementeringen af gzip (i FreeBSD 7.0 i 2007) for konsistens med bzip2. Det gzip er baseret på en omskrivning af GNU gzip af NetBSD. -k mulighed gjorde det til sidst tilbage til NetBSD i 2010 .

Kommentarer

  • Geez. RHEL6 leveres kun med zip 1.3.12 i basen …
  • Dette fungerer på Mac / OS X 🙂 (hvilket er BSD)
  • Er der mange standarddistroer, der ikke bruger > = 1.6 længere? Spekulerer på, om svaret skal opdateres
  • Hvad er " – " til? Jeg synes, gzip -k " -fil " fungerer fint.
  • @notilas se unix.stackexchange.com/q/11376/22142

Svar

Fra dokumentationen ser det ud til, at der ikke er nogen mulighed for at oprette en kopi af filen.

Du kan definere en shell-funktion

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

og derefter

gzipkeep file.txt 

Kommentarer

  • Bemærk, at hvis filen er -, du skal kalde det som gzipkeep ./-.
  • Dette er den bedste løsning til scripts IMO, da du kan være sikker på, at outputfilen > "$1.gz" vil eksistere nøjagtigt som angivet. Desuden kan du også angive et andet navn, hvis behovet skulle opstå.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *