zcat / gzcatは、osxではなくLinuxで動作します。一般的なlinux / osxの互換性


50

まず特定の問題:Linuxでは、zcatを使用して.zipファイルをリストします。osxでは、zcatは自動的にファイル名に.Zを追加するようです。さまざまな人々が、zcatをgzcatに置き換えることを提案しています。ただし、gzcatは、ファイルがgzip形式ではないと文句を言います!

'file'はこれを示しています:... Zipアーカイブデータ、抽出する少なくとも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 14年

私はそれが日常だとは言いません。私は通常zip、zipファイルを扱うために使用しますgzip
マイケルハンプトン

回答:


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上で動作しますOK
ヴァレリオ・スキアヴォーニ

1
どうやら私の答えは間違っています。Linuxはzcat読みます.zip.Zファイル。ここでの問題は、標準ファイルと名前付きファイルのいずれでもありません。プログラムのLinuxメンテナーが、gzcat多数の無関係なファイルタイプを読み取るように変更したことです。
vy32

これを別のプロセスにどのようにパイプしますか?
ペタ

|別のプロセスにパイプするために使用:cat < foo.txt.gz | wc
vy32

これにより、少なくともOSXで問題が解決します
-jimh

18

これは古い質問です。しかし、さらに古いgithubスレッドから解決策を見つけました。

Mac OS Xでエラーなしgunzip -cで動作するのと同じように動作する単純な使用が可能ですzcat

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

13

あなたは使用して、例えばマックOS X用のGNU utilsパッケージをインストールすることができ自作(実行brew install coreutils gnu-sedインストールし、gzcatらとのgsed)。これにより、各コマンドのGNU実装が提供されます。

次に、あなたの生活を楽にするために、各コマンドの変数を作成し(例えばsed=gsed$sedその後使用します)、または単にalias sed=gsedあなたが書くスクリプトでそれらをエイリアスします(例えば)。利便性のためにgnu-tools-for-mac.shの要点を書きました。このコードをスクリプトの上に置く(または含める)。

アーカイブの圧縮と抽出の両方にGNU実装を使用します。OS XとGNU実装の使用を混在させることはできないと思います。


3
または、に追加/usr/local/opt/coreutils/libexec/gnubinしてPATHgプレフィックスなしで使用できるようにすることもできます。
bfontaine 14

3

これを試してみたところ、非常に面白いことがわかりました!以下のためgzのファイル、我々は実行することが予想されているgzcatMac 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ファイルの読み取りをサポートしていません。manページから:

このバージョンのgzipは、compress(1)またはを使用して圧縮されたファイルを解凍することもできますbzip2(1)

しかし、Linux(GNU)バージョンはそうです。

gunzipすることができ、現在で作成されたファイルを解凍しgzipzipcompresscompress -Hまたはpack

サードパーティは、Mac OS X用のGNU gzipをパッケージ化しています。これらはウェブ検索で見つけることができます。それがおそらく最も抵抗の少ない道です。


Webを検索して新しいソフトウェアをインストールすることは、決して抵抗の少ない道ではありません
vy32

0

おかしなことに、bash-scriptを実行したときに同じ問題が発生しました。これはbash somescript.shgzcat内部でforループを実行しました。しかし、スクリプト内でこれらのこと試してみてくださいsomescript.sh...:

  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-techieの専門家ではありません-しかし、それは元のコードと連携して機能しました...

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

... 私のスクリプトsomescript.sh

たぶんそれは誰かに役立つでしょう。

ベスト、

サンダー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.