¿Cómo decirle a gzip que mantenga el archivo original?


210

Me gustaría comprimir un archivo de texto usando la herramienta de línea de comando gzip mientras mantengo el archivo original. Por defecto ejecuta el siguiente comando

gzip file.txt

resulta en modificar este archivo y renombrarlo file.txt.gz. En lugar de este comportamiento, me gustaría tener este nuevo archivo comprimido además del existente file.txt. Por ahora estoy usando el siguiente comando para hacer eso

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

Funciona, pero me pregunto por qué no hay una solución más fácil para hacer una tarea tan común. ¿Tal vez me perdí la opción de hacer eso?


3
Esto se debe a que gzip comprime el archivo dado y crea un nuevo archivo. La compresión significa comprimir el archivo original y reemplazarlo por uno nuevo. Su opción "-c" le dice explícitamente a gzip que lo guarde con otro nombre. Por eso funciona
SHW

@SHW ¿No recibí tu comentario ...?
Manuel Selva

@ManuelSelva una vez que el archivo original está comprimido, ya no es necesario, supongo que ese fue el diseño.
margarita

2
¿Por qué gzip / gunzip hace esto por defecto cuando ninguna otra herramienta de Unix lo hace ?
Mateen Ulhaq

Respuestas:


247

Para GNU gzip1.6 o superior, FreeBSD y derivados o versiones recientes de NetBSD, vea la respuesta de don_cristi .

Con cualquier versión, puede usar redirecciones de shell como en:

gzip < file > file.gz

Cuando no se le da ningún argumento, gziplee su entrada estándar, la comprime y escribe la versión comprimida en su salida estándar. Como beneficio adicional, al usar redirecciones de shell, no tiene que preocuparse por los archivos llamados "--help"o "-"(para los que este último sigue siendo un problema gzip -c --).

Otro beneficio adicional gzip -c file > file.gzes que si fileno se puede abrir, el comando fallará sin crear un vacío file.gz(o sobrescribir uno existente file.gz) y sin ejecutarse gzipen absoluto.

Sin gzip -kembargo, una diferencia significativa en comparación es que no se intentará copiar los filemetadatos (propiedad, permisos, tiempo de modificación, nombre del archivo sin comprimir) en file.gz.

Además, si file.gzya existía, lo anulará silenciosamente a menos que haya activado la noclobberopción en su shell (con, set -o noclobberpor ejemplo, en shells POSIX).


44
Ahora esto aborda los detalles de la pregunta del OP y responde a la pregunta general "Cómo decirle a gzip que mantenga el archivo original". Muy práctico y más útil que -c.
codewaggle

8
Tenga en cuenta que se supone que <y> deben escribirse en el comando y no representan un marcador de posición para el nombre de archivo
Gaurav Gupta

Cual es la -kopcion? No se pudo encontrar en las páginas de manual, por ejemplo, esta versión aquí linux.die.net/man/1/gzip . Además, parece que gzip copia los metadatos del archivo de forma predeterminada.
flow2k

1
@ flow2k, ese es el enlace a la respuesta de don_cristi.
Stéphane Chazelas

Ah, lo veo en mis macos, pero lástima que no esté en RHEL ni Ubuntu. Gracias.
flow2k

138

Tenga en cuenta que el lanzamiento reciente (junio de 2013) "acepta la opción --keep (-k), por coherencia con herramientas como xz, lzip y bzip2. Con esta opción, gzip ya no elimina los archivos de entrada con nombre al comprimir o descomprimir" .gzip-1.6

Extracto de la página del manual:

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

Entonces, a partir de 1.6, puede usar -ko --keepconservar el archivo original:

gzip -k -- "$file"

(tenga en cuenta que no funciona si $filees -(que gzipinterpreta como stdin de significado en lugar del archivo real llamado -), en cuyo caso, debe cambiarlo a ./-)

Esa opción se introdujo por primera vez en la implementación de FreeBSD degzip (en FreeBSD 7.0 en 2007) para mantener la coherencia bzip2. Eso gzipse basa en una reescritura de GNU gzippor parte de NetBSD. La -kopción finalmente regresó a NetBSD en 2010 .


10
Geez RHEL6 solo viene con zip 1.3.12 en la base ...
Nicholas Tolley Cottrell

Esto funciona en Mac / OS X :) (que es BSD)
Paul

¿Hay muchas distribuciones estándar que ya no usan> = 1.6? Preguntándose si la respuesta necesita actualización
MichaelChirico

¿Que es por? Creo que gzip -k "file" funciona bien.
Notilas


30

De la documentación parece que no hay opción para crear una copia del archivo.

Puedes definir una función de shell

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

y entonces

gzipkeep file.txt

2
Tenga en cuenta que si el archivo es -, debe llamarlo como gzipkeep ./-.
Stéphane Chazelas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.