Frage zcat / gzcat funktioniert in Linux, nicht auf osx. Allgemeine Linux / OSX-Kompatibilität


Zuerst das spezifische Problem: In Linux verwende ich zcat, um eine ZIP-Datei aufzulisten. In osx scheint zcat automatisch Z an den Dateinamen anzufügen. Verschiedene Leute schlagen vor, zcat durch gzcat zu ersetzen; Allerdings beschwert sich Gzcat, dass die Datei nicht im Gzip-Format ist!

'Datei' zeigt dies an: ... Zip Archiv Daten, mindestens v2.0 zu extrahieren

Also wird weder zcat noch gzcat in osx funktionieren, was kann ich tun?

Ich habe ein mittelgroßes Skript in 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 erwarte, dass dies ein recht routinemäßiger Arbeitsablauf ist, der von anderen Personen erledigt werden muss.


31
2018-01-27 00:26


Ursprung


Wenn es sich um Zip-Archiv-Daten handelt, ist es das nicht im gzip-Format! - Michael Hampton♦
@MichaelHampton Ich kann zcat auf Linux gut. Weder zcat noch gzcat funktionieren auf osx. Wie kann ich das lösen? Gibt es eine andere Reihe von Dienstprogrammen, die ich sowohl unter Linux als auch unter OSX installieren kann? Diese Skripte sind meine eigenen, so dass 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 vornehmen kann. - user23398
Ich würde nicht sagen, dass es Routine ist. Ich benutze im Allgemeinen zip mit Zip-Dateien umgehen, nicht gzip. - Michael Hampton♦


Antworten:


Du hast recht. Es ist nerviges 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

62
2018-01-27 00:48



Dies funktioniert unter OS X einwandfrei. - Valerio Schiavoni
Offensichtlich ist meine Antwort falsch. Linux zcat werde lesen .zip und .Z Dateien. Das Problem hier ist nicht eine von stdin vs. benannte Datei, es ist, dass die Linux-Betreuer der Programme geändert haben gzcat um eine große Anzahl von nicht verwandten Dateitypen zu lesen. - vy32
Wie würden wir das auf einen anderen Prozess übertragen? - Petah
Benutzen | zu einem anderen Prozess leiten: cat < foo.txt.gz | wc - vy32
Dies wird Ihr Problem beheben, zumindest auf OSX - jimh


Ich weiß, das ist eine alte Frage. Allerdings fand ich eine Lösung von einem noch älteren GitHub-Gewinde.

Du kannst es einfach benutzen gunzip -c das funktioniert ähnlich zcat ohne die Fehler unter Mac OS X.

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

13
2017-07-09 06:13





Sie können GNU Utils für Mac OS X installieren, z Homebrew (Lauf brew install coreutils gnu-sed, die installiert gzcat et al. und gsed). Dadurch erhalten Sie die GNU-Implementierung jedes Befehls.

Dann, um Ihr Leben einfacher zu machen, machen Sie eine Variable für jeden Befehl (z. sed=gsedund benutzen $sed anschließend) oder einfach Alias ​​(z. alias sed=gsed) in jedem Skript, das du schreibst. Ich habe einen Gedanken dazu geschrieben: gnu-tools-for-mac.sh. Fügen Sie diesen Code über Ihre Skripts ein (oder fügen Sie ihn ein).

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


10
2018-05-22 11:52



Sie können alternativ hinzufügen /usr/local/opt/coreutils/libexec/gnubin zu deinem PATH, die sie ohne die zur Verfügung stellt g Präfix. - bfontaine


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

Diese Version von gzip ist auch in der Lage, komprimierte Dateien mit zu dekomprimieren compress(1) oder bzip2(1).

Aber die Linux (GNU) Version tut es.

gunzip kann Dateien, die von erstellt wurden, momentan dekomprimieren gzip, zip, compress, compress -H oder 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.


0
2018-01-27 03:37



Die Suche im Internet und die Installation neuer Software ist noch nie der Weg des geringsten Widerstandes. - vy32


Lustig, ich hatte das gleiche Problem beim Ausführen eines bash-Skript, bash somescript.sh, die eine for-Schleife mit ausgeführt hat gzcat im Inneren. Aber diese Dinge versuchen Innerhalb das somescript.sh-Skript ...:

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

... belief sich auf nichts ...

Aber ich habe auch einen Verweis auf ein Verzeichnis verwendet:

SOMEDIR="~/DIR1/DIR2/DATA"

Was als interpretiert wird ~/DIR1/DIR2/DATA und anscheinend funktioniert das nicht innerhalb der bash-Skript innerhalb macOS. Das hat funktioniert:

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

Was als interpretiert wird /Users/someuser/DIR1/DIR2/DATA. Ich weiß nicht warum - ich bin kein Experte macOS-BASH-Technikfreak - 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.

... innerhalb meine somescript.sh-Skript.

Vielleicht ist es nützlich für jemanden.

Beste,

Sander


0
2017-07-18 21:04