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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *