zcat/gzcat 适用于 linux,而不适用于 osx。一般的 linux/osx 兼容性

use*_*398 67 linux bash mac-osx

首先是具体问题:在 linux 中,我使用 zcat 列出一个 .zip 文件。在 osx 中,zcat 似乎会自动将 .Z 附加到文件名。很多人建议用 gzcat 替换 zcat;但是,gzcat 抱怨该文件不是 gzip 格式!

'file ' 显示: ...Zip 存档数据,至少要提取 v2.0

所以 zcat 或 gzcat 在 osx 中都不起作用,我该怎么办?

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

vy3*_*y32 126

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

$ zcat foo.txt.gz 
zcat: can't stat: foo.txt.gz (foo.txt.gz.Z): No such file or directory
Run Code Online (Sandbox Code Playgroud)

尝试这个:

$ zcat < foo.txt.gz 
asdfadsf
Run Code Online (Sandbox Code Playgroud)

  • 这在 OS X 上运行正常。 (3认同)
  • 显然我的答案是错误的。Linux `zcat` 将读取 `.zip` 和 `.Z` 文件。这里的问题不是标准输入与命名文件之间的问题,而是程序的 Linux 维护者修改了“gzcat”以读取大量不相关的文件类型。 (2认同)

小智 30

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

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

$ gunzip -c 20150707_backup.sql.gz | mysql -u mysql_user -p
Run Code Online (Sandbox Code Playgroud)


Pet*_*ino 17

您可以为 Mac OS X 安装 GNU 实用程序,例如,使用自制软件(运行brew install coreutils gnu-sed,安装gzcat等。和gsed)。这将为您提供每个命令的 GNU 实现。

然后,为了让您的生活更轻松,为每个命令创建一个变量(例如sed=gsed,然后使用$sed),或者alias sed=gsed在您编写的任何脚本中简单地将它们别名(例如)。为了您的方便,我为此编写了一个要点:gnu-tools-for-mac.sh。将此代码放在(或包含)脚本之上。

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

  • 你也可以将 `/usr/local/opt/coreutils/libexec/gnubin` 添加到你的 `PATH`,这将使它们在没有 `g` 前缀的情况下可用。 (3认同)

小智 10

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

解决方案1

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

解决方案2

  • 将文件导入到管道中zcat,它将起作用。
  • 例如,cat /path/to/file.gz | zcat将工作。

我希望这有帮助!