Jag vill komprimera en textfil med hjälp av gzip-kommandoradsverktyget medan behåller originalfilen. Som standard körs följande kommando
gzip file.txt
resulterar i att den här filen ändras och bytt namn på den file.txt.gz
. istället för detta beteende vill jag ha den här nya komprimerade filen i tillägg till den befintliga file.txt
. För närvarande använder jag följande kommando för att göra det
gzip -c file.txt > file.txt.gz
Det fungerar men jag undrar varför det inte finns någon enklare lösning att göra en så gemensam uppgift? Kanske missade jag alternativet att göra det?
Kommentarer
- Detta beror på att gzip komprimerar den givna filen och skapar en ny fil. Komprimering innebär att du klämmer in originalfilen och ersätter den med en ny. Ditt " -c " alternativ säger uttryckligen till gzip att spara det med andra namn. Det är ' varför det fungerar
- @SHW Jag fick inte ' inte din kommentar …?
- @ManuelSelva när originalfilen är komprimerad är den ' inte längre nödvändig, jag antar att det var designen.
- Varför gzip / gunzip gör detta som standard när inget annat unix-verktyg gör det är bortom mig.
Svar
För GNU gzip
1.6 eller högre, FreeBSD och derivat eller senare versioner av NetBSD, se don_cristis svar .
Med vilken version som helst kan du använda skalomdirigeringar som i:
gzip < file > file.gz
När det inte ges vilket argument som helst, gzip
läser sin standardinmatning, komprimerar den och skriver den komprimerade versionen till sin standardutgång. Som en bonus behöver du inte oroa dig för filer när du använder skalomdirigeringar. kallas "--help"
eller "-"
(den senare fortfarande är ett problem för gzip -c --
).
En annan fördel jämfört med gzip -c file > file.gz
är att om file
kan inte öppnas, kommandot misslyckas utan att skapa en tom file.gz
(eller skriva över en befintlig file.gz
) och utan att köra gzip
alls.
En signifikant skillnad jämfört med gzip -k
är dock att det inte blir något försök att kopiera file
”s metadata (ägande, behörigheter, ändringstid, namn på okomprimerad fil) till file.gz
.
Även om file.gz
redan fanns, kommer det tyst att åsidosätta det om du inte har aktiverat alternativet noclobber
i ditt skal (med set -o noclobber
till exempel i POSIX-skal).
Kommentarer
- Detta adresserar nu specifikationerna för OP ' s fråga och svarar ge nervfråga " Hur man säger till gzip att behålla originalfilen ". Mycket praktiskt och mer användbart än
-c
. - Observera att < och > ska egentligen skrivas in i kommandot och representerar inte en platshållare för filnamnet
- Vad ' är
-k
alternativ? Kunde inte ' hitta det på mansidorna, t.ex. den här versionen här linux.die.net/man/1/gzip . Det ser också ut som att gzip kopierar filen ' s metadata som standard. - @ flow2k, att ' s länken till don_cristi ' s svar.
- @St é phaneChazelas Arbetar också med gzip version 1.4.
cat file | gzip > file.gz
Svar
Observera att det nyligen (juni 2013 ) släppt gzip-1.6
" accepterar –keep (-k) -alternativ för överensstämmelse med verktyg som xz, lzip och bzip2. Med det här alternativet tar gzip inte längre bort namngivna inmatningsfiler när du komprimerar eller dekomprimerar " .
Utdrag från mansidan:
-k --keep Keep (don"t delete) input files during compression or decompression.
Så som från 1.6
kan du använda -k
eller --keep
för att behålla originalfilen:
gzip -k -- "$file"
(notera att den inte fungerar om $file
är -
(som gzip
tolkar som betydelse stdin istället för den faktiska filen som heter -
), i vilket fall måste du ändra det till ./-
)
Det alternativet var introducerades först i FreeBSD-implementeringen av gzip
(i FreeBSD 7.0 2007) för överensstämmelse med bzip2
. Det gzip
bygger på en omskrivning av GNU gzip
av NetBSD. gjorde det så småningom tillbaka till NetBSD 2010 .
Kommentarer
- Gej. RHEL6 levereras endast med zip 1.3.12 i bas …
- Detta fungerar på Mac / OS X 🙂 (vilket är BSD)
- Finns det många standarddistroer som inte använder > = 1.6 längre? Undrar om svaret behöver uppdateras
- Vad är " – " för? Jag tycker att gzip -k " -fil " fungerar bra.
- @notilas se unix.stackexchange.com/q/11376/22142
Svar
Från dokumentationen verkar det inte finnas något alternativ att skapa en kopia av filen.
Du kan definiera en skalfunktion
gzipkeep() { if [ -f "$1" ] ; then gzip -c -- "$1" > "$1.gz" fi }
och sedan
gzipkeep file.txt
Kommentarer
- Observera att om filen är
-
, du måste kalla det somgzipkeep ./-
. - Detta är den bästa lösningen för IMO-skript, eftersom du kan vara säker på att utdatafilen
> "$1.gz"
existerar precis som angivet. Dessutom kan du också ange ett annat namn om behovet skulle uppstå.