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

gzip file.txt 

da como resultado la modificación de este archivo y renombrarlo file.txt.gz. en lugar de este comportamiento, me gustaría tener este nuevo archivo comprimido en además al 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. ¿Quizás me perdí la opción de hacer eso?

Comentarios

  • Esto se debe a que gzip comprime el archivo dado y crea un nuevo archivo. La compresión significa exprimir el archivo original y reemplazarlo por uno nuevo. Su opción " -c " le dice explícitamente a gzip que lo guarde con otro nombre. Esa ' es la razón por la que funciona
  • @SHW No ' recibí tu comentario …?
  • @ManuelSelva una vez que el archivo original está comprimido, ' ya no es necesario, supongo que ese era el diseño.
  • Por qué gzip / gunzip hacer esto por defecto cuando ninguna otra herramienta de Unix hace esto está fuera de mi alcance.

Responder

Para GNU gzip 1.6 o superior, FreeBSD y derivados o versiones recientes de NetBSD, consulte Don_cristi «s answer .

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

gzip < file > file.gz 

Cuando no se proporciona cualquier argumento, gzip lee su entrada estándar, la comprime y escribe la versión comprimida en su salida estándar. Como beneficio adicional, cuando usa redirecciones de shell, no tiene que preocuparse por los archivos llamado "--help" o "-" (este último todavía siendo un problema para gzip -c --).

Otro beneficio sobre gzip -c file > file.gz es que si file no se puede abrir, el comando fallará sin crear un file.gz vacío (o sobrescribir un file.gz existente) y sin ejecutar gzip en absoluto.

Sin embargo, una diferencia significativa en comparación con gzip -k es que no habrá ningún intento de copiando los metadatos de file «(propiedad, permisos, hora de modificación, nombre del archivo sin comprimir) a file.gz.

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

Comentarios

  • Ahora, esto aborda los detalles del OP ' s pregunta y responde la ge Pregunta neral " Cómo decirle a gzip que mantenga el archivo original ". Muy útil y más útil que -c.
  • Tenga en cuenta que < y > en realidad se supone que se escriben en el comando y no representan un marcador de posición para el nombre del archivo
  • ¿Qué ' es el -k opción? No se pudo ' encontrarlo en las páginas de manual, p. Ej. esta versión aquí linux.die.net/man/1/gzip . Además, parece que gzip copia los metadatos del archivo ' de forma predeterminada.
  • @ flow2k, que ' s el enlace a la respuesta de don_cristi '.
  • @St é phaneChazelas También funciona en la versión 1.4 de gzip. cat file | gzip > file.gz

Responder

Tenga en cuenta que recientemente (junio de 2013 ) publicado gzip-1.6 " acepta el –keep (-k), para mantener la 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 " .

Extracto de la página de manual:

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

Entonces, a partir de 1.6, puede usar -k o --keep para mantener el archivo original:

gzip -k -- "$file" 

(tenga en cuenta que no funciona si $file es - (que gzip interpreta como stdin en lugar del archivo real llamado -), en cuyo caso, debe cambiarlo a ./-)

Esa opción era introducido por primera vez en la implementación de FreeBSD de gzip (en FreeBSD 7.0 en 2007) para mantener la coherencia con bzip2. Eso gzip se basa en una reescritura de GNU gzip por NetBSD. El finalmente regresó a NetBSD en 2010 .

Comentarios

  • Caray. RHEL6 solo viene con zip 1.3.12 en la base …
  • Esto funciona en Mac / OS X 🙂 (que es BSD)
  • ¿Hay muchas distribuciones estándar que no usan > = 1.6 ¿ya? Se pregunta si es necesario actualizar la respuesta
  • ¿Para qué sirve " – "? Creo que gzip -k " file " funciona bien.
  • @notilas ver unix.stackexchange.com/q/11376/22142

Responder

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

Puede definir una función de shell

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

y luego

gzipkeep file.txt 

Comentarios

  • Tenga en cuenta que si el archivo es -, debe llamarlo como gzipkeep ./-.
  • Esta es la mejor solución para scripts en mi opinión, ya que puede estar seguro de que el archivo de salida > "$1.gz" existirá exactamente como se especifica. Además, también puede especificar un nombre diferente si surge la necesidad.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *