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
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.
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
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
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.
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)
orbzip2(1)
.
Mas a versão Linux (GNU) faz .
gunzip
can currently decompress files created bygzip
,zip
,compress
,compress -H
orpack
.
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.
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 ...:
zcat < file.txt.gz
brew install coreutils
, mas mesmo assim, re-instalei: brew reinstall coreutils
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