zcat / gzcat funktioniert unter Linux, nicht unter OSX. Allgemeine Linux / OSX-Kompatibilität

50

Zuerst das spezifische Problem: Unter Linux verwende ich zcat, um eine .zip-Datei aufzulisten. In osx scheint zcat .Z automatisch an den Dateinamen anzuhängen. Verschiedene Leute schlagen vor, zcat durch gzcat zu ersetzen. gzcat beschwert sich jedoch, dass die Datei nicht im gzip-Format vorliegt!

'file' zeigt Folgendes: ... Zip-Archivdaten, mindestens v2.0 zum Extrahieren

Weder zcat noch gzcat funktionieren in osx. Was kann ich tun?

Ich habe ein mittelgroßes Skript in Bash, das zcat / gzcat, sed awk und andere grundlegende Dienstprogramme verwendet, um eine Reihe von Dateien zu verarbeiten. Ich möchte diese Umgebung auf meinem OSX-Laptop duplizieren, damit ich offline arbeiten kann. Irgendwelche allgemeinen Vorschläge, wie ich solche Schmerzen vermeiden kann? Ich gehe davon aus, dass dies ein ziemlich routinemäßiger Workflow ist, der also von anderen aussortiert worden sein muss.

user23398
quelle
2
Wenn es sich um Zip-Archivdaten handelt, sind sie nicht im gzip-Format!
Michael Hampton
@MichaelHampton Ich kann zcat unter Linux in Ordnung. Weder zcat noch gzcat funktionieren unter osx. Wie kann ich das beheben? Gibt es eine Reihe weiterer Dienstprogramme, die ich installieren kann und die sowohl unter Linux als auch unter OSX funktionieren? Diese Skripte sind meine eigenen, damit ich sie ändern kann (obwohl ich sie einfach halten möchte). Ich kontrolliere auch beide Linux / Osx-Umgebungen, so dass ich auch einfache Installationen auf beiden ausführen kann.
user23398
Ich würde nicht sagen, dass es Routine ist. Ich zipbeschäftige mich in der Regel mit zip-Dateien, nicht gzip.
Michael Hampton

Antworten:

89

Du hast recht. Es ist ärgerliches Verhalten.

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

Versuche dies:

$ zcat < foo.txt.gz 
asdfadsf
vy32
quelle
2
Dies funktioniert unter OS X
Valerio Schiavoni
1
Anscheinend ist meine Antwort falsch. Linux zcatliest .zipund .ZDateien. Das Problem hierbei ist nicht, dass die Linux-Betreuer der Programme gzcateine große Anzahl nicht verwandter Dateitypen gelesen haben.
VY32
Wie würden wir das auf einen anderen Prozess übertragen?
Petah
Verwenden Sie |diese cat < foo.txt.gz | wc
Option, um
Dies behebt Ihr Problem, zumindest unter OSX
14.
18

Ich weiß, das ist eine alte Frage. Ich fand jedoch eine Lösung aus einem noch älteren Github-Thread .

Sie können einfach verwenden gunzip -c, das funktioniert ähnlich wie zcatohne die Fehler unter Mac OS X.

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

Sie können GNU-Utils für Mac OS X installieren, z. B. mit Homebrew (run brew install coreutils gnu-sed, das gzcatua und installiert gsed). Dadurch erhalten Sie die GNU-Implementierung für jeden Befehl.

Um Ihnen das Leben zu erleichtern, können Sie für jeden Befehl eine Variable erstellen (z. B. sed=gsedund $sedanschließend verwenden) oder sie einfach alias sed=gsedin jedem Skript, das Sie schreiben , als Alias ​​verwenden (z. B. ). Ich habe eine Zusammenfassung dazu geschrieben: gnu-tools-for-mac.sh . Fügen Sie diesen Code oben in Ihre Skripte ein.

Verwenden Sie die GNU-Implementierung zum Komprimieren und Extrahieren der Archive. Ich würde sagen, Sie können die Verwendungszwecke der OS X- und GNU-Implementierung nicht mischen.

Peterino
quelle
3
Alternativ können Sie fügen Sie /usr/local/opt/coreutils/libexec/gnubinzu Ihrem PATH, die sie ohne die zur Verfügung stellen wird gPräfix.
Bfontaine
3

Ich habe es gerade ausprobiert und etwas sehr Interessantes gefunden! Für gzDateien wird erwartet, dass sie gzcatunter Mac OS ausgeführt werden.

Lösung 1

  • Verwenden Sie gzcat /path/to/file.gzund es sollte funktionieren.
  • Bei Verwendung zcat /path/to/file.gzwird ein Fehler angezeigt.

Lösung 2

  • Pipe in der Datei nach zcatund es wird funktionieren.
  • Zum Beispiel cat /path/to/file.gz | zcatwird funktionieren.

Ich hoffe das hilft!

Jigarius
quelle
0

Die Mac OS X-Version von gzip(1) unterstützt das Lesen von ZIP-Dateien nicht . Von der Manpage:

Diese Version von gzip kann auch Dateien dekomprimieren, die mit compress(1)oder komprimiert wurden bzip2(1).

Aber die Linux (GNU) -Version tut es .

gunzipkann zur Zeit dekomprimieren Dateien erstellt gzip, zip, compress, compress -Hoder pack.

Dritte haben GNU gzip für Mac OS X gepackt. Sie können diese über eine Websuche finden. Das ist wahrscheinlich der Weg des geringsten Widerstands.

Michael Hampton
quelle
Das Durchsuchen des Webs und das Installieren neuer Software ist niemals der Weg des geringsten Widerstands.
vy32
0

bashKomischerweise hatte ich das gleiche Problem beim Ausführen eines -scripts bash somescript.sh, das eine for-Schleife mit gzcatdarin ausführte . Doch der Versuch , diese Dinge innerhalb der somescript.sh-script ...:

  1. zcat < file.txt.gz
  2. Ich hatte brew install coreutilsbereits installiert , aber dennoch neu installiert:brew reinstall coreutils
  3. gunzip -c file.txt.gz

... war nichts ...

Ich habe aber auch einen Verweis auf ein Verzeichnis verwendet:

SOMEDIR="~/DIR1/DIR2/DATA"

Was so interpretiert wird ~/DIR1/DIR2/DATAund anscheinend nicht im bash-script funktioniert macOS. Das hat funktioniert:

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

Welches als interpretiert wird /Users/someuser/DIR1/DIR2/DATA. Ich weiß nicht warum - ich bin kein erfahrener macOS-BASH-Techniker - aber es funktionierte in Verbindung mit meinem ursprünglichen Code ...

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

... in meinem somescript.sh-script.

Vielleicht ist es für jemanden nützlich.

Beste,

Sander

Sander W. van der Laan
quelle