Me gustaría crear un archivo comprimido que conserve el nombre del archivo original. Por ejemplo, gzipping "example.txt" debería generar un archivo comprimido denominado "example.txt" en lugar de "example.txt.gz". ¿Es posible hacer esto elegantemente con un comando (sin hacer un posterior mv
)?
14
Respuestas:
Esto no funciona:
Esta es una condición de carrera:
El problema es que el
> example.txt
(odd of=example.txt
para el caso) mata el archivo antes de que el otro proceso tenga la oportunidad de leerlo. Por lo tanto, no hay una solución obvia, razón por la cual debe seguirmv
.Hay varias formas de hacer trampa. Puede abrir el archivo, luego desvincularlo (el archivo continuará existiendo hasta que lo cierre) y luego crear un nuevo archivo con el mismo nombre y escribir los datos comprimidos en él. Sin embargo, no conozco una forma obvia de obligar a bash a usar eso, e incluso si lo supiera, mi respuesta sería:
Ni siquiera lo hagas.
Si
gzip
falla por algún motivo, o se produce algún problema, como que se está quedando sin espacio mientras se comprime (porque otros procesos están escribiendo, o el resultado de gzip es mayor que la entrada, que ocurre con datos aleatorios, etc.), acaba de perder su archivo . ¡Felicidades!Cree un archivo separado y
mv
en caso de éxito. Ese es el método más simple, fácil de entender y más confiable que jamás encontrará.fuente
gzip example.txt && mv example.txt.gz example.txt
mv
en caso de éxito". se puede hacer más elegante? Solo intentaba proponer que la respuesta de frostschutz se aumentara con un ejemplo específico. Simv
puede usarse con más elegancia de lo que pensaba, por favor, dé un ejemplo.Tuve el mismo problema, como parte de una implementación de CI en AWS S3.
Esto es lo que hice para comprimir recursivamente un directorio (en su lugar) sin el
.gz
sufijo:Parece lo suficientemente limpio para mí. Pero sí, parece que necesitas una
mv
en algún lado.Si estás usando
grunt
puedes mirargrunt-contrib-compress
. Algunas de lasgrunt
herramientas específicas para implementar en S3 también manejarán gzip para usted.fuente
find . -type ...
no se debefind.
agregar el espacio por favor :)-S
extensión que deseadará como resultado dog.txt_2015_11
cuando lo descomprimes debes especificar la extensión.
En Unix, use el comando de archivo para determinar qué tipo de archivo tiene, las extensiones son engañosas o faltan a menudo.
fuente
No creo que crear un archivo gzip sin extensión sea realmente lo correcto.
IMHo debe configurar su servidor web para leer el archivo .gz. Probablemente ya tengas una regla como esta:
Solo necesita agregar una regla que reescriba el nombre de archivo solicitado para agregar ".gz" (en realidad, debe verificar que el archivo exista, al igual que debe verificar que el cliente enumeró gzip en su encabezado Accept-Encoding)
fuente
Puede probar s3_website para esto.
No me gusta el hecho de que está escrito en escala y rubí y que necesita una JVM. Además, no me gusta la suposición que hace (especialmente el hecho de que elimina archivos adicionales del cubo), pero debería funcionar si estás de acuerdo con eso.
Estoy planeando escribir una herramienta como esta que no tenga estas limitaciones, estad atentos.
fuente
Esto no es realmente algo que debería estar haciendo, principalmente porque al transferir este archivo a otros sistemas o personas, podría terminar siendo confuso para ellos y no encontrarlo como un archivo comprimido.
Si no desea utilizar ningún sufijo, entonces GNU no es bueno para usted, como
gzip -S ""
devolvería agzip: invalid suffix ''
.Sin embargo, siempre puede enviar algo como
gzip -S " "
(espacio en blanco), y se mostrará así:Luego, si desea descomprimirlo, tendrá que hacer algo como
gunzip -c testfile\
(sin especificar el sufijo), o incluso con la-f
bandera.Sinceramente, creo que agregar un
mv
comando con&&
no supondría una molestia para su código. De todos modos, y como ha dicho @frostschutz, no es una muy buena idea hacer esto.fuente