Haluan pakata tekstitiedoston gzip-komentorivityökalulla samalla kun pidetään alkuperäinen tiedosto. Oletuksena seuraavan komennon suorittaminen

gzip file.txt 

johtaa tämän tiedoston muokkaamiseen ja uudelleennimeämiseen file.txt.gz. Tämän käytöksen sijaan haluaisin saada tämän uuden pakatun tiedoston tiedostoon lisäys nykyiseen file.txt. Tällä hetkellä käytän seuraavaa komentoa.

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

Se toimii, mutta ihmettelen, miksi ei ole helpompaa ratkaisua tällaisen yhteisen tehtävän suorittamiseen? Ehkä unohdin vaihtoehdon tekemällä sen?

Kommentit

  • Tämä johtuu siitä, että gzip pakkaa annetun tiedoston ja luo uuden tiedoston. Pakkaus tarkoittaa alkuperäisen tiedoston puristamista ja korvaamista uudella. Vaihtoehtosi " -c " käskee gzipiä nimenomaisesti tallentamaan sen toisella nimellä. Siksi ' s miksi se toimii
  • @SHW En saanut ' kommenttiasi …?
  • @ManuelSelva kun alkuperäinen tiedosto on pakattu, sitä ' ei enää tarvita, luulen, että se oli muotoilu.
  • Miksi gzip / gunzip tee tämä oletuksena , kun mikään muu unix-työkalu ei tee tätä on minun ulkopuolella.

Vastaa

GNU gzip 1.6 tai uudempi, FreeBSD ja johdannaiset tai NetBSD: n viimeisimmät versiot, katso don_cristin vastaus .

Missä tahansa versiossa voit käyttää kuoren uudelleenohjauksia kuten kohdassa:

gzip < file > file.gz 

Kun ei annettu mikä tahansa argumentti, gzip lukee vakiotulonsa, pakkaa sen ja kirjoittaa pakatun version vakiotulokseen. Bonuksena, kun käytät kuoren uudelleenohjauksia, sinun ei tarvitse huolehtia tiedostoista kutsutaan "--help" tai "-" (jälkimmäinen edelleen gzip -c --) ongelma.

Toinen etu gzip -c file > file.gz: n etuna on, että jos file ei voi avata, komento epäonnistuu luomatta tyhjää file.gz (tai korvaamalla olemassa olevaa file.gz) ja juoksematta lainkaan gzip.

Merkittävä ero verrattuna gzip -k -ohjelmaan on kuitenkin se, ettei yritystä yritetä kopioimalla file ”-metatiedot (omistajuus, oikeudet, muokkausaika, pakkaamattoman tiedoston nimi) tiedostoon file.gz.

Jos file.gz oli jo olemassa, se ohittaa sen äänettömästi, ellet ole ottanut noclobber -asetusta käyttöön shellissäsi (set -o noclobber esimerkiksi POSIX-kuoreissa).

Kommentit

  • Nyt käsitellään OP ' kysymys ja vastaa maantieteelliseen kysymykseen neral-kysymys " Kuinka kertoa gzip: lle alkuperäisen tiedoston säilyttäminen ". Erittäin kätevä ja hyödyllisempi kuin -c.
  • Huomaa, että < ja > on todellakin kirjoitettu komentoon, eivätkä ne edusta tiedostonimen paikkamerkkiä.
  • Mitä ' s -k vaihtoehto? ' ei löydy sitä man-sivuilta, esim. tämä versio on täällä linux.die.net/man/1/gzip . Näyttää myös siltä, että gzip kopioi oletusarvoisesti tiedoston ' metatiedot.
  • @ flow2k, että ' s linkki don_cristi ' -vastaukseen.
  • @St é phaneChazelas Työskentely myös gzip-versiossa 1.4. cat file | gzip > file.gz

vastaus

Huomaa, että äskettäin (kesäkuu 2013) ) vapautettu gzip-1.6 " hyväksyy –keep (-k) -vaihtoehto, jotta voidaan varmistaa yhdenmukaisuus työkalujen kuten xz, lzip ja bzip2 kanssa. Tällä vaihtoehdolla gzip ei enää poista nimettyjä syötetiedostoja pakattaessa tai purettaessa " .

Ote man-sivulta:

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

Joten 1.6 alkaen voit käyttää -k tai --keep alkuperäisen tiedoston säilyttämiseksi:

gzip -k -- "$file" 

(huomaa, että se ei toimi, jos $file on - (joka gzip tulkitsee merkityksen stdin varsinaisen tiedoston -), jolloin sinun on vaihdettava se muotoon ./-)

Tämä vaihtoehto oli esiteltiin ensimmäisen kerran gzip : n FreeBSD-toteutuksessa (FreeBSD 7.0: ssa vuonna 2007) johdonmukaisuuden kanssa bzip2. = ”364395b9e0″>

perustuu GNU: n gzip uudelleenkirjoittamiseen NetBSD: llä. -k -vaihtoehto palasi lopulta takaisin NetBSD: hen vuonna 2010 .

Kommentit

  • Geez. RHEL6: n mukana tulee vain zip 1.3.12 …
  • Tämä toimii Mac / OS X :): ssä (joka on BSD)
  • Onko olemassa monia tavallisia distroja, jotka eivät käytä > = 1,6 enää? Mietitkö, onko vastaus päivitettävä
  • Mihin " – " tarkoitetaan? Luulen, että gzip -k " -tiedosto " toimii hyvin.
  • @notilas see unix.stackexchange.com/q/11376/22142

Vastaa

Dokumentaatiosta näyttää siltä, että tiedostosta ei ole mahdollisuutta luoda kopiota.

Voit määrittää kuoritoiminnon

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

ja sitten

gzipkeep file.txt 

Kommentit

  • Huomaa, että jos tiedosto on -, sinun on kutsuttava sitä nimellä gzipkeep ./-.
  • Tämä on paras ratkaisu IMO-komentosarjoille, koska voit olla varma, että lähtötiedosto > "$1.gz" on olemassa täsmälleen kuten määritelty. Voit myös määrittää toisen nimen, jos tarvetta ilmenee.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *