zcat / gzcat funciona no linux, não no osx. compatibilidade geral com linux / osx

35

Primeiro, o problema específico: No linux, eu uso o zcat para listar um arquivo .zip. No osx, o zcat parece anexar automaticamente .Z ao nome do arquivo. Várias pessoas sugerem a substituição de zcat por gzcat; no entanto, gzcat reclama que o arquivo não está no formato gzip!

'arquivo' mostra isso: ... Zip arquivar dados, pelo menos v2.0 para extrair

Então nem o zcat nem o gzcat funcionarão no osx, o que posso fazer?

Eu tenho um script de tamanho médio no bash que usa, zcat / gzcat, sed awk e outros utilitários básicos para processar vários arquivos. Eu gostaria de duplicar esse ambiente no meu laptop osx para que eu possa trabalhar off-line. Alguma sugestão geral de como posso evitar tanta dor? Espero que este seja um fluxo de trabalho bastante rotineiro, então deve ter sido resolvido por outros.

    
por user23398 27.01.2014 / 01:26

5 respostas

68

Você está certo. É um comportamento irritante.

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

Tente isto:

$ zcat < foo.txt.gz 
asdfadsf
    
por 27.01.2014 / 01:48
14

Eu sei que esta é uma questão antiga. No entanto, encontrei uma solução de um thread github ainda mais antigo.

Você pode simplesmente usar gunzip -c que funciona de forma semelhante a zcat sem os erros no Mac OS X.

$ gunzip -c 20150707_backup.sql.gz | mysql -u mysql_user -p
    
por 09.07.2015 / 08:13
10

Você pode instalar utilitários GNU para Mac OS X, por exemplo, usando homebrew (execute brew install coreutils gnu-sed , que instala gzcat et al. e gsed ). Isto irá fornecer-lhe a implementação GNU de cada comando.

Depois, para facilitar a sua vida, crie uma variável para cada comando (por exemplo, sed=gsed e use $sed subseqüentemente) ou simplesmente alie-os (por exemplo, alias sed=gsed ) em qualquer script que você escrever. Eu escrevi um Gist sobre isso para sua conveniência: gnu-tools-for-mac.sh . Coloque (ou inclua) este código no topo dos seus scripts.

Use a implementação GNU para compactar e extrair os arquivos. Eu diria que você não pode misturar os usos da implementação do OS X e GNU.

    
por 22.05.2014 / 13:52
0

A versão do Mac OS X de gzip(1) doesn ' t suporta a leitura de arquivos zip . Na página do manual:

This version of gzip is also capable of decompressing files compressed using compress(1) or bzip2(1).

Mas a versão Linux (GNU) faz .

gunzip can currently decompress files created by gzip, zip, compress, compress -H or pack.

Terceiros têm o GNU gzip empacotado para o Mac OS X; você pode encontrá-los em uma pesquisa na web. Esse é provavelmente o caminho de menor resistência.

    
por 27.01.2014 / 04:37
0

Engraçado, tive o mesmo problema ao executar um bash -script, bash somescript.sh , que executou um loop for com gzcat dentro dele. Mas tentando essas coisas dentro , o somescript.sh -script ...:

  1. zcat < file.txt.gz
  2. Já instalei brew install coreutils , mas mesmo assim, re-instalei: brew reinstall coreutils
  3. gunzip -c file.txt.gz

... não deu em nada ...

Mas também usei uma referência a um diretório:

SOMEDIR="~/DIR1/DIR2/DATA"

O que é interpretado como ~/DIR1/DIR2/DATA e aparentemente não funciona dentro do bash -script em macOS . Isso funcionou:

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

Qual é interpretado como /Users/someuser/DIR1/DIR2/DATA . Eu não sei porque - eu não sou um especialista em macOS-BASH-techie - mas funcionou em conjunto com o meu código original ...

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

... dentro de meu somescript.sh -script.

Talvez seja útil para alguém.

Melhor,

Sander

    
por 18.07.2018 / 23:04