zcat / gzcat在Linux上有效,而不在osx上有效。常规linux / osx兼容性


50

首先是特定的问题:在linux中,我使用zcat列出一个.zip文件。在osx中​​,zcat似乎会自动在文件名后附加.Z。各种各样的人建议用gzcat代替zcat。但是,gzcat抱怨文件不是gzip格式!

'file'显示如下:...压缩存档数据,至少提取v2.0版本

所以zcat或gzcat都不能在osx中​​工作,该怎么办?

我在bash中有一个中等大小的脚本,该脚本使用zcat / gzcat,sed awk和其他基本实用程序来处理许多文件。我想在osx笔记本电脑上复制该环境,以便可以脱机工作。有什么一般建议可以避免这种痛苦吗?我希望这是一个相当常规的工作流程,因此必须已被其他人整理。


2
如果是Zip存档数据,则不是 gzip格式!
迈克尔·汉普顿

@MichaelHampton我可以在Linux上使用zcat很好。zcat和gzcat都不在osx上运行。那么我该如何解决呢?我是否可以安装另一套可以在linux和osx上运行的实用程序?这些脚本是我自己的,因此我可以更改它们(尽管我想使它们保持简单)。我也同时控制linux / osx环境,因此我也可以在两者上进行简单安装。
user23398 2014年

我不会说这很常规。我通常zip用来处理zip文件,而不是gzip
迈克尔·汉普顿

Answers:


89

你是对的。这是令人讨厌的行为。

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

尝试这个:

$ zcat < foo.txt.gz 
asdfadsf

2
该工程确定在OS X
瓦莱里奥Schiavoni大道

1
显然我的答案是错误的。Linux zcat将读取.zip.Z归档。这里的问题不是stdin与命名文件之一,而是Linux程序的维护者经过修改gzcat可以读取大量不相关的文件类型。
vy32 2015年

我们如何将其传送到另一个进程?
Petah

用于|通过管道传输到另一个进程:cat < foo.txt.gz | wc
vy32

这将至少在OSX上解决您的问题
jimh's

18

我知道这是一个老问题。但是,我从一个更老的github线程找到了一个解决方案。

您可以简单地使用gunzip -c类似于zcatMac OS X上没有错误的工作方式。

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

13

您可以安装Mac OS X的GNU utils,例如使用homebrew(run brew install coreutils gnu-sed,安装gzcatet ..和gsed)。这将为您提供每个命令的GNU实现。

然后,为了使您的生活更轻松,请为每个命令设置一个变量(例如sed=gsed,然后再使用$sed),或者alias sed=gsed在您编写的任何脚本中简单地对它们进行别名(例如,)。为了方便起见,我为此写了一个要点:gnu-tools-for-mac.sh。将此代码放在(或包括)脚本的顶部。

使用GNU实现来压缩和提取档案。我会说您不能混合使用OS X和GNU实现。


3
您也可以添加/usr/local/opt/coreutils/libexec/gnubin到中PATH,使它们不带g前缀即可使用。
bfontaine 2014年

3

我只是尝试一下,发现一些非常有趣的东西!对于gz文件,我们预计将gzcat在Mac OS上运行。

解决方案1

  • 使用gzcat /path/to/file.gz,它应该可以工作。
  • 使用zcat /path/to/file.gz将给您一个错误。

解决方案2

  • 通过管道将文件发送到zcat它将起作用。
  • 例如,cat /path/to/file.gz | zcat将工作。

我希望这有帮助!


0

的Mac OS X版本gzip(1) 不支持读取zip文件。从手册页:

gzip版本还可以解压缩使用compress(1)或压缩的文件bzip2(1)

但是Linux(GNU)版本可以

gunzip目前可以通过解压缩创建的文件gzipzipcompresscompress -Hpack

第三方已将Mac OS X的GNU gzip打包;您可以通过网络搜索找到这些内容。这可能是阻力最小的途径。


搜索网络和安装新软件绝不是阻力最小的途径。
vy32

0

有趣的是,我在执行bash-script 时遇到了相同的问题,该脚本在bash somescript.sh其中执行了for循环gzcat。但是,试图这些东西里面somescript.sh-script ...:

  1. zcat < file.txt.gz
  2. 我已经安装brew install coreutils了,但是仍然重新安装了:brew reinstall coreutils
  3. gunzip -c file.txt.gz

...什么也没有...

但是我也使用了对目录的引用:

SOMEDIR="~/DIR1/DIR2/DATA"

解释为~/DIR1/DIR2/DATA,显然在的bash-script内不起作用macOS。这工作:

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

解释为/Users/someuser/DIR1/DIR2/DATA。我不知道为什么-我不是专业的macOS-BASH技术人员-但它与我的原始代码配合使用...

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

... 我的somescript.sh脚本中。

也许对某人有用。

最好,

桑德

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.