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.
zip
para lidar com arquivos zip, nãogzip
.Respostas:
Você está certo. É um comportamento irritante.
Tente o seguinte:
fonte
zcat
irá ler.zip
e.Z
arquivos. O problema aqui não é um arquivo stdin vs. nomeado, é que os mantenedores do Linux dos programas foram modificadosgzcat
para ler um grande número de tipos de arquivos não relacionados.|
para canalizar para outro processo:cat < foo.txt.gz | wc
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 -c
que funciona de maneira semelhante,zcat
sem os erros no Mac OS X.fonte
Você pode instalar os utilitários GNU para Mac OS X, por exemplo, usando homebrew (execute
brew install coreutils gnu-sed
, que instalagzcat
et al. Egsed
). 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$sed
posteriormente) ou simplesmente aliase-as (por exemploalias 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.
fonte
/usr/local/opt/coreutils/libexec/gnubin
ao seuPATH
, o que os disponibilizará sem og
prefixo.Eu apenas tentei e encontrei algo muito interessante! Para
gz
arquivos, espera-se que seja executadogzcat
no Mac OS.Solução 1
gzcat /path/to/file.gz
e deve funcionar.zcat /path/to/file.gz
irá gerar um erro.Solução 2
zcat
e ele funcionará.cat /path/to/file.gz | zcat
vai funcionar.Eu espero que isso ajude!
fonte
A versão do Mac OS X
gzip(1)
não suporta a leitura de arquivos zip . Na página do manual:Mas a versão Linux (GNU) funciona .
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.
fonte
Engraçado, tive o mesmo problema ao executar um
bash
scriptbash somescript.sh
, que executava um loop forgzcat
dentro dele. Mas tentar essas coisas dentro dosomescript.sh
-script ...:zcat < file.txt.gz
brew install coreutils
já havia instalado , mas mesmo assim, reinstalado:brew reinstall coreutils
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/DATA
e aparentemente não funciona dentro dobash
-script dentromacOS
. 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.sh
script.Talvez seja útil para alguém.
melhor,
Sander
fonte