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 somgzipkeep ./-
. - 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å.