Aș dori să comprim un fișier text folosind instrumentul pentru linia de comandă gzip în timp ce păstrează fișierul original. Rularea implicită a următoarei comenzi

gzip file.txt 

are ca rezultat modificarea acestui fișier și redenumirea acestuia file.txt.gz. în locul acestui comportament aș dori să am acest nou fișier comprimat în adăugare la cel existent file.txt. Deocamdată folosesc următoarea comandă pentru a face asta

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

Funcționează, dar mă întreb de ce nu există o soluție mai ușoară pentru a face o sarcină atât de comună? Poate că am ratat opțiunea de a face asta?

Comentarii

  • Acest lucru se datorează faptului că, gzip comprimă fișierul dat și creează un fișier nou. Compresia înseamnă stoarcerea fișierului original și înlocuirea acestuia cu unul nou. Opțiunea " -c " îi spune în mod explicit gzip să o salveze cu alt nume. ' este motivul pentru care funcționează
  • @SHW ' nu am primit comentariul tău …?
  • @ManuelSelva odată comprimat fișierul original, ' nu mai este necesar, cred că acesta a fost designul.
  • De ce gzip / gunzip faceți acest lucru în mod implicit când niciun alt instrument Unix nu face acest lucru este dincolo de mine.

Răspuns

Pentru GNU gzip 1.6 sau mai sus, FreeBSD și derivate sau versiuni recente ale NetBSD, consultați răspunsul lui don_cristi .

Cu orice versiune, puteți utiliza redirecționările shell ca în:

gzip < file > file.gz 

Când nu este dat orice argument, gzip citește intrarea sa standard, o comprimă și scrie versiunea comprimată la ieșirea sa standard. Ca bonus, atunci când utilizați redirecționări shell, nu trebuie să vă faceți griji cu privire la fișiere numit "--help" sau "-" (cel din urmă încă fiind o problemă pentru gzip -c --).

Un alt avantaj față de gzip -c file > file.gz este că dacă file nu se poate deschide, comanda va eșua fără a crea un file.gz gol (sau a suprascrie un file.gz existent) și fără a rula gzip deloc.

O diferență semnificativă în comparație cu gzip -k este că nu va exista nicio încercare de copierea metadatelor file „(proprietate, permisiuni, timp de modificare, numele fișierului necomprimat) în file.gz.

De asemenea, dacă file.gz a existat deja, acesta îl va suprascrie în liniște, cu excepția cazului în care ați activat opțiunea noclobber în shell (cu set -o noclobber de exemplu în shell-urile POSIX).

Comentarii

  • Acum, aceasta abordează specificul OP ' s întrebare și răspunde la ge întrebare generală " Cum să spuneți gzip să păstreze fișierul original ". Foarte la îndemână și mai util decât -c.
  • Rețineți că < și > se presupune că sunt de fapt introduse în comandă și nu reprezintă un substituent pentru numele fișierului
  • Ce ' este -k opțiune? ' nu l-am putut găsi în paginile de manual, de ex. această versiune aici linux.die.net/man/1/gzip . De asemenea, se pare că gzip copiază în mod implicit metadatele fișierului '.
  • @ flow2k, ' s linkul către răspunsul don_cristi '.
  • @St é phaneChazelas Lucrând și la versiunea gzip 1.4. cat file | gzip > file.gz

Răspuns

Rețineți că recent (iunie 2013 ) lansat gzip-1.6 " acceptă –keep (-k) opțiune, pentru consistență cu instrumente precum xz, lzip și bzip2. Cu această opțiune, gzip nu mai elimină fișierele de intrare denumite la comprimarea sau decomprimarea " .

Fragment din pagina de manual:

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

Deci, începând cu 1.6, puteți utiliza -k sau --keep pentru a păstra fișierul original:

gzip -k -- "$file" 

(rețineți că nu funcționează dacă $file este - (pe care gzip îl interpretează ca semnificând stdin în loc de fișierul actual numit -), caz în care trebuie să o schimbați în ./-)

Această opțiune a fost introdus pentru prima dată în implementarea FreeBSD a gzip (în FreeBSD 7.0 în 2007) pentru coerență cu bzip2. Acel gzip se bazează pe o rescriere a GNU gzip de NetBSD. a revenit în cele din urmă la NetBSD în 2010 .

Comentarii

  • Geez. RHEL6 vine doar cu zip 1.3.12 în bază …
  • Acest lucru funcționează pe Mac / OS X 🙂 (care este BSD)
  • Există multe distribuții standard care nu utilizează > = 1.6 mai? Vă întrebați dacă răspunsul trebuie actualizat
  • Pentru ce este " – "? Cred că gzip -k " fișier " funcționează bine.
  • @notilas vezi unix.stackexchange.com/q/11376/22142

Răspuns

Din documentație se pare că nu există nicio opțiune pentru a crea o copie a fișierului.

Puteți defini o funcție shell

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

și apoi

gzipkeep file.txt 

Comentarii

  • Rețineți că dacă fișierul este -, trebuie să îl numiți ca gzipkeep ./-.
  • Aceasta este cea mai bună soluție pentru scripturile IMO, deoarece puteți fi sigur că fișierul de ieșire > "$1.gz" va exista exact așa cum este specificat. În plus, puteți specifica, de asemenea, un nume diferit dacă ar apărea nevoia.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *