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