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.
zip
beschäftige mich in der Regel mit zip-Dateien, nichtgzip
.Antworten:
Du hast recht. Es ist ärgerliches Verhalten.
Versuche dies:
quelle
zcat
liest.zip
und.Z
Dateien. Das Problem hierbei ist nicht, dass die Linux-Betreuer der Programmegzcat
eine große Anzahl nicht verwandter Dateitypen gelesen haben.|
diesecat < foo.txt.gz | wc
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 wiezcat
ohne die Fehler unter Mac OS X.quelle
Sie können GNU-Utils für Mac OS X installieren, z. B. mit Homebrew (run
brew install coreutils gnu-sed
, dasgzcat
ua und installiertgsed
). 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=gsed
und$sed
anschließend verwenden) oder sie einfachalias sed=gsed
in 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.
quelle
/usr/local/opt/coreutils/libexec/gnubin
zu IhremPATH
, die sie ohne die zur Verfügung stellen wirdg
Präfix.Ich habe es gerade ausprobiert und etwas sehr Interessantes gefunden! Für
gz
Dateien wird erwartet, dass siegzcat
unter Mac OS ausgeführt werden.Lösung 1
gzcat /path/to/file.gz
und es sollte funktionieren.zcat /path/to/file.gz
wird ein Fehler angezeigt.Lösung 2
zcat
und es wird funktionieren.cat /path/to/file.gz | zcat
wird funktionieren.Ich hoffe das hilft!
quelle
Die Mac OS X-Version von
gzip(1)
unterstützt das Lesen von ZIP-Dateien nicht . Von der Manpage:Aber die Linux (GNU) -Version tut es .
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.
quelle
bash
Komischerweise hatte ich das gleiche Problem beim Ausführen eines -scriptsbash somescript.sh
, das eine for-Schleife mitgzcat
darin ausführte . Doch der Versuch , diese Dinge innerhalb dersomescript.sh
-script ...:zcat < file.txt.gz
brew install coreutils
bereits installiert , aber dennoch neu installiert:brew reinstall coreutils
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/DATA
und anscheinend nicht imbash
-script funktioniertmacOS
. 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
quelle