zcat / gzcat funciona en linux, no en osx. compatibilidad general de linux / osx

50

Primero, el problema específico: en Linux, uso zcat para listar un archivo .zip. En osx, zcat parece agregar automáticamente .Z al nombre del archivo. Varias personas sugieren reemplazar zcat con gzcat; ¡Sin embargo, gzcat se queja de que el archivo no está en formato gzip!

'archivo' muestra esto: ... Zip datos de archivo, al menos v2.0 para extraer

Entonces, ni zcat ni gzcat funcionarán en osx, ¿qué puedo hacer?

Tengo un script de tamaño mediano en bash que usa zcat / gzcat, sed awk y otras utilidades básicas para procesar una cantidad de archivos. Me gustaría duplicar ese entorno en mi computadora portátil osx para poder trabajar sin conexión. ¿Alguna sugerencia general de cómo puedo evitar ese dolor? Espero que este sea un flujo de trabajo bastante rutinario, por lo que debe haber sido resuelto por otros.

user23398
fuente
2
Si se trata de datos de archivo Zip, es no en formato gzip!
Michael Hampton
@MichaelHampton Puedo zcat en linux bien. Ni zcat ni gzcat funcionan en osx. Entonces, ¿cómo puedo resolver esto? ¿Hay otro conjunto de utilidades que pueda instalar que funcione tanto en Linux como en OSX? Estos scripts son míos, así que puedo cambiarlos (aunque me gustaría mantenerlos simples). También controlo ambos entornos linux / osx para poder hacer instalaciones simples en ambos.
user23398
Yo no diría que es rutina. Generalmente uso zippara tratar con archivos zip, no gzip.
Michael Hampton

Respuestas:

90

Tienes razón. Es un comportamiento molesto.

$ zcat foo.txt.gz 
zcat: can't stat: foo.txt.gz (foo.txt.gz.Z): No such file or directory

Prueba esto:

$ zcat < foo.txt.gz 
asdfadsf
vy32
fuente
2
Esto funciona bien en OS X.
Valerio Schiavoni
1
Aparentemente mi respuesta es incorrecta. Linux zcatleerá .zipy .Zarchivos. El problema aquí no es uno de stdin vs. archivo con nombre, es que los mantenedores de Linux de los programas modificados gzcatpara leer una gran cantidad de tipos de archivos no relacionados.
vy32
¿Cómo canalizaríamos esto a otro proceso?
Petah
Use |para canalizar a otro proceso:cat < foo.txt.gz | wc
vy32
Esto solucionará su problema, al menos en OSX
jimh
18

Sé que esta es una vieja pregunta. Sin embargo, encontré una solución de un hilo de github aún más antiguo .

Simplemente puede usar gunzip -ceso funciona de manera similar a zcatsin los errores en Mac OS X.

$ gunzip -c 20150707_backup.sql.gz | mysql -u mysql_user -p
dakdad
fuente
13

Puede instalar utilidades GNU para Mac OS X, por ejemplo, usando homebrew (ejecutar brew install coreutils gnu-sed, que instala gzcatet al. Y gsed). Esto le proporcionará la implementación de GNU de cada comando.

Luego, para facilitarle la vida, haga una variable para cada comando (por ejemplo sed=gsed, y úsela $sedposteriormente), o simplemente alínelos (por ejemplo alias sed=gsed) en cualquier script que escriba. He escrito un Gist sobre esto para su conveniencia: gnu-tools-for-mac.sh . Ponga (o incluya) este código en la parte superior de sus scripts.

Utilice la implementación de GNU para comprimir y extraer los archivos. Yo diría que no puedes mezclar los usos de la implementación de OS X y GNU.

Peterino
fuente
3
Alternativamente, puede agregar /usr/local/opt/coreutils/libexec/gnubina su PATH, lo que los hará disponibles sin el gprefijo.
bfontaine
3

¡Acabo de probar esto y encontré algo muy interesante! Para los gzarchivos, se espera que se ejecuten gzcaten Mac OS.

Solución 1

  • Uso gzcat /path/to/file.gzy debería funcionar.
  • Usar zcat /path/to/file.gzte dará un error.

Solución 2

  • Instale el archivo en zcaty funcionará.
  • Por ejemplo, cat /path/to/file.gz | zcatfuncionará.

¡Espero que esto ayude!

Jigarius
fuente
0

La versión de Mac OS X gzip(1) no admite la lectura de archivos zip . Desde la página del manual:

Esta versión de gzip también es capaz de descomprimir archivos comprimidos usando compress(1)o bzip2(1).

Pero la versión de Linux (GNU) sí .

gunzipActualmente se pueden descomprimir archivos creados por gzip, zip, compress, compress -Ho pack.

Los terceros han empaquetado GNU gzip para Mac OS X; Puede encontrarlos en una búsqueda web. Ese es probablemente el camino de menor resistencia.

Michael Hampton
fuente
Buscar en la web e instalar nuevo software nunca es el camino de menor resistencia.
vy32
0

Es curioso, tuve el mismo problema al ejecutar un bash-script bash somescript.sh, que ejecutó un bucle for gzcatdentro. Pero probando estas cosas dentro del somescript.sh-script ...:

  1. zcat < file.txt.gz
  2. Ya había instalado brew install coreutils, pero no obstante, reinstalé:brew reinstall coreutils
  3. gunzip -c file.txt.gz

... ascendió a nada ...

Pero también usé una referencia a un directorio:

SOMEDIR="~/DIR1/DIR2/DATA"

Lo cual se interpreta como ~/DIR1/DIR2/DATAy aparentemente no funciona dentro del bashscript dentro macOS. Esto funcionó:

SOMEDIR="${HOME}/DIR1/DIR2/DATA"

Lo cual se interpreta como /Users/someuser/DIR1/DIR2/DATA. No sé por qué, no soy un experto en macOS-BASH-techie, pero funcionó junto con mi código original ...

gzcat file.txt.gz | awk '{ print $1, $2, $3, $4, $5, $6 }' > ${SOMEDIR}/new.file.txt.

... dentro de mi somescript.sh-script.

Quizás sea útil para alguien.

Mejor,

Lijadora

Sander W. van der Laan
fuente