Szeretnék tömöríteni egy szövegfájlt a gzip parancssori eszközzel, miközben megtartja a az eredeti fájlt. Alapértelmezés szerint a következő parancs futtatása

gzip file.txt 

a fájl módosítását és átnevezését eredményezi file.txt.gz. e viselkedés helyett ezt az új tömörített fájlt szeretném elérni a fájlban a meglévő . Egyelőre a következő parancsot használom erre:

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

Működik, de kíváncsi vagyok, miért nincs egyszerűbb megoldás egy ilyen közös feladat elvégzésére? Lehet, hogy kihagytam ezt a lehetőséget?

Megjegyzések

  • Ennek oka, hogy a gzip tömöríti az adott fájlt, és új fájlt hoz létre. A tömörítés azt jelenti, hogy összenyomja az eredeti fájlt, és kicseréli az újat. A " -c " opció kifejezetten arra utasítja a gzip-et, hogy más néven mentse el. ' miért működik
  • @SHW Nem értettem ' a megjegyzését …?
  • @ManuelSelva az eredeti fájl tömörítése után ' már nincs rá szükség, azt hiszem, ez volt a tervezés.
  • Miért éppen a gzip / gunzip tegye ezt alapértelmezés szerint amikor ezt egyetlen más unix eszköz sem teszi meg rajtam kívül.

Válasz

GNU gzip 1.6 vagy újabb, FreeBSD és származékai, illetve a NetBSD legújabb verziói: lásd: don_cristi válasza .

Bármely verzióval használhatja a shell átirányításait a következők szerint:

gzip < file > file.gz 

Ha nincs megadva bármely argumentum, gzip beolvassa a szokásos bemenetet, tömöríti és a tömörített verziót a standard kimenetére írja. Bónuszként a shell átirányítások használatakor nem kell aggódnia a fájlok miatt "--help" vagy "-" nevű (ez utóbbi még mindig problémát jelent a gzip -c --) számára.

A gzip -c file > file.gz -hez képest további előny, hogy ha file nem nyitható meg, a parancs meghiúsul üres file.gz létrehozása nélkül (vagy egy meglévő file.gz felülírása) és a gzip futtatása nélkül.

Jelentős különbség a gzip -k -hez képest, bár az, hogy nem lesz kísérlet a file “metaadatok (tulajdonjog, engedélyek, módosítási idő, tömörítetlen fájl neve) másolása a file.gz fájlba.

Ha file.gz már létezett, akkor ezt csendben felülírja, hacsak nem kapcsolja be a noclobber opciót a héjában (set -o noclobber például a POSIX héjakban).

Megjegyzések

  • Most ez foglalkozik az OP ' kérdés és válaszol a ge-re neral kérdés " Hogyan mondhatjuk el a gzip-nek, hogy őrizze meg az eredeti fájlt ". Nagyon hasznos és hasznosabb, mint a -c.
  • Ne feledje, hogy a < és > valójában a parancsba kell beírni, és nem képviselik a fájlnév helyőrzőjét.
  • Mi ' s a -k opció? ' nem található meg a man oldalakon, pl. ez a verzió itt linux.die.net/man/1/gzip . Úgy tűnik, hogy a gzip alapértelmezés szerint másolja a ' fájl metaadatait.
  • @ flow2k, hogy ' s a link a don_cristi ' válaszra.
  • @St é phaneChazelas Az 1.4-es gzip verzión is dolgozunk. cat file | gzip > file.gz

Válasz

Ne feledje, hogy a közelmúltban (2013. június) ) megjelent gzip-1.6 " elfogadja a –keep (-k) opció az olyan eszközökkel való konzisztencia érdekében, mint az xz, az lzip és a bzip2. Ezzel az opcióval a gzip már nem távolítja el a megnevezett bemeneti fájlokat a " tömörítésekor vagy kicsomagolásakor.

Kivonat a man oldalról:

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

Tehát 1.6 -tól kezdve használhatja a -k vagy --keep az eredeti fájl megőrzéséhez:

gzip -k -- "$file" 

(vegye figyelembe, hogy nem működik, ha a $file - (amelyet gzip a - stdin jelentésként értelmez. / div>), ebben az esetben meg kell változtatnia a következőt: ./-)

Ez az opció volt először a gzip (a FreeBSD 7.0-ban 2007-ben) FreeBSD implementációjában vezették be a bzip2 konzisztencia érdekében. = “364395b9e0″>

a GNU gzip átírásán alapszik a NetBSD részéről. A -k opció végül visszatért a NetBSD-re 2010-ben .

Megjegyzések

  • Geez. Az RHEL6 csak az 1.3.12-es zip fájlt tartalmazza az alapban …
  • Ez Mac / OS X-en működik 🙂 (ami BSD)
  • Van-e sok szabványos disztró, amely nem használja a > = 1,6 már? Kíváncsi arra, hogy a válasz frissítést igényel-e
  • Mire való a " – "? Szerintem a gzip -k " fájl " jól működik.
  • @notilas see unix.stackexchange.com/q/11376/22142

Válasz

A dokumentációból úgy tűnik, hogy nincs lehetőség a fájl másolatának létrehozására.

Megadhat egy shell funkciót

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

, majd

gzipkeep file.txt 

Megjegyzések

  • Ne feledje, hogy ha a fájl -, gzipkeep ./- néven kell hívnod.
  • Ez a legjobb megoldás az IMO szkriptek számára, mivel biztos lehet benne, hogy a kimeneti fájl A > "$1.gz" pontosan a megadott módon fog létezni. Ezenkívül megadhat egy másik nevet is, ha erre szükség van.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük