desarrollo-web-br-bd.com

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

Me gustaría comprimir un archivo de texto usando la herramienta de línea de comando gzip mientras manteniendo 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 en 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?

221
Manuel Selva

Para GNU gzip 1.6 o superior, FreeBSD y derivados o versiones recientes de NetBSD, vea 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, gzip lee 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 "-" (este último sigue 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 (o sobrescribir un file.gz) vacío y sin ejecutar gzip en absoluto.

Sin embargo, una diferencia significativa en comparación con gzip -k es que no se intentará copiar los metadatos de file (propiedad, permisos, tiempo 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).

254
Stéphane Chazelas

Tenga en cuenta que el lanzamiento reciente (junio de 2013) gzip-1.6 "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 ".

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 -k O --keep Para mantener el archivo original:

gzip -k -- "$file"

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

Esa opción era introducida por primera vez en la implementación de FreeBSD de gzip (en FreeBSD 7.0 en 2007) por coherencia con bzip2. Que gzip se basa en una reescritura de GNU gzip por NetBSD. La opción -k Eventualmente regresó a NetBSD en 201 .

149
don_crissti

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

Puedes definir una función Shell

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

y entonces

gzipkeep file.txt
30
Matteo