web-dev-qa-db-ja.com

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

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

'file'はこれを示しています:... Zipアーカイブデータ、少なくともv2.0を抽出します

したがって、zcatもgzcatもosxでは機能しません。どうすればよいですか?

私は中規模のスクリプトをbashで使用しており、zcat/gzcat、sed awk、その他の基本的なユーティリティを使用して、多数のファイルを処理します。オフラインで作業できるように、OSXラップトップでその環境を複製したいと思います。どのように私はそのような痛みを避けることができるか一般的な提案はありますか?これはかなり日常的なワークフローだと思いますので、他の人が整理したはずです。

56
user23398

あなたが正しいです。それは迷惑な行動です。

$ 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
98
vy32

私はこれが古い質問であることを知っています。しかし、私はさらに古い github thread からの解決策を見つけました。

gunzip -cはMac OS Xではエラーなしでzcatと同様に機能します。

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

GNU utils for Mac OS X、例えばusing homebrew (run brew install coreutils gnu-sedgzcatなどをインストールします。およびgsed)。これにより、各コマンドのGNU実装が提供されます。

次に、作業を簡単にするために、各コマンドの変数を作成します(例:sed=gsed、および$sed続いて)、または単にエイリアスを付けます(例:alias sed=gsed)あなたが書くどんなスクリプトでも。私はあなたの便宜のためにこれに要旨を書きました: gnu-tools-for-mac.sh 。このコードをスクリプトの上に配置(または組み込み)します。

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

13
Peterino

私はこれを試してみて、とても面白いものを見つけました! gzファイルの場合、Mac OSでgzcatを実行することが想定されています。

解決策1

  • gzcat /path/to/file.gzを使用してください。
  • zcat /path/to/file.gzを使用すると、エラーが発生します。

解決策2

  • ファイルをzcatにパイプすると、動作します。
  • たとえば、cat /path/to/file.gz | zcatは機能します。

これが役に立てば幸いです!

4
Jigarius

Mac OS Xバージョンのgzip(1)Zipファイルの読み取りをサポートしていません 。 manページから:

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

ただし、Linux(GNU)バージョンにはあります

gunzipは現在、gzipZipcompresscompress -Hまたはpackによって作成されたファイルを解凍できます。

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

0
Michael Hampton

おかしい、bash- script、bash somescript.shを実行するときに同じ問題が発生しました。これは、内部でgzcatを使用してforループを実行しました。しかし、これらを試してみるinsidesomescript.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内の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

... within my somescript.sh- script。

多分それは誰かにとって便利です。

ベスト、

サンダー