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 -
./-
)
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.