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.