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


50

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 do zcat pelo gzcat; no entanto, o gzcat reclama que o arquivo não está no formato gzip!

'file' mostra o seguinte: ... Dados de arquivo compactado, pelo menos v2.0 para extrair

Portanto, 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. Gostaria de duplicar esse ambiente no meu laptop osx para poder trabalhar offline. Alguma sugestão geral de como posso evitar tanta dor? Espero que este seja um fluxo de trabalho bastante rotineiro, portanto, deve ter sido resolvido por outras pessoas.


2
Se são dados de arquivo Zip, não estão no formato gzip!
Michael Hampton

@MichaelHampton Eu posso zcat no linux fine. Nem o zcat nem o gzcat funcionam no osx. Então, como posso resolver isso? Existe outro conjunto de utilitários que posso instalar que funcione tanto no linux quanto no osx? Esses scripts são meus, para que eu possa alterá-los (embora eu queira mantê-los simples). Também controlo os ambientes linux / osx para que eu possa fazer instalações simples em ambos.
precisa saber é o seguinte

Eu não diria que é rotina. Eu geralmente uso zippara lidar com arquivos zip, não gzip.
Michael Hampton

Respostas:


90

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 o seguinte:

$ zcat < foo.txt.gz 
asdfadsf

2
Isso funciona bem no OS X.
Valerio Schiavoni

1
Aparentemente, minha resposta está errada. Linux zcatirá ler .zipe .Zarquivos. O problema aqui não é um arquivo stdin vs. nomeado, é que os mantenedores do Linux dos programas foram modificados gzcatpara ler um grande número de tipos de arquivos não relacionados.
vy32

Como direcionaríamos isso para outro processo?
Petah

Use |para canalizar para outro processo:cat < foo.txt.gz | wc
vy32 11/11

Isto irá corrigir o problema, pelo menos no OSX
jimh

18

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

Você pode simplesmente usar o gunzip -cque funciona de maneira semelhante, zcatsem os erros no Mac OS X.

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

13

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

Então, para facilitar sua vida, faça uma variável para cada comando (por exemplo sed=gsed, e use $sedposteriormente) ou simplesmente aliase-as (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) esse código em cima 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.


3
Como alternativa, você pode adicionar /usr/local/opt/coreutils/libexec/gnubinao seu PATH, o que os disponibilizará sem o gprefixo.
Bfontaine 07/07

3

Eu apenas tentei e encontrei algo muito interessante! Para gzarquivos, espera-se que seja executado gzcatno Mac OS.

Solução 1

  • Use gzcat /path/to/file.gze deve funcionar.
  • Usar zcat /path/to/file.gzirá gerar um erro.

Solução 2

  • Coloque o arquivo no arquivo zcate ele funcionará.
  • Por exemplo, cat /path/to/file.gz | zcatvai funcionar.

Eu espero que isso ajude!


0

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

Esta versão do gzip também é capaz de descomprimir arquivos compactados usando compress(1)or bzip2(1).

Mas a versão Linux (GNU) funciona .

gunzippode arquivos atualmente descomprimir criado por gzip, zip, compress, compress -Hou pack.

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


Pesquisando na web e instalando novo software nunca é o caminho de menor resistência.
vy32

0

Engraçado, tive o mesmo problema ao executar um bashscript bash somescript.sh, que executava um loop for gzcatdentro dele. Mas tentar essas coisas dentro do somescript.sh-script ...:

  1. zcat < file.txt.gz
  2. Eu brew install coreutilsjá havia instalado , mas mesmo assim, reinstalado:brew reinstall coreutils
  3. gunzip -c file.txt.gz

... não dava em nada ...

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

SOMEDIR="~/DIR1/DIR2/DATA"

O qual é interpretado como ~/DIR1/DIR2/DATAe aparentemente não funciona dentro do bash-script dentro macOS. Isso funcionou:

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

Qual é interpretado como /Users/someuser/DIR1/DIR2/DATA. Não sei por que - não sou especialista em macOS-BASH-techie -, mas funcionou em conjunto com meu código original ...

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

... dentro do meu somescript.shscript.

Talvez seja útil para alguém.

melhor,

Sander

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.