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.

user23398
fonte
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
vy32
fonte
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
dakdad
fonte
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.

Peterino
fonte
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!

Jigarius
fonte
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.

Michael Hampton
fonte
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

Sander W. van der Laan
fonte