zcat / gzcat fonctionne sous Linux, pas sous osx. compatibilité générale linux / osx

51

D'abord le problème spécifique: sous Linux, j'utilise zcat pour répertorier un fichier .zip. Dans osx, zcat semble ajouter automatiquement le .Z au nom du fichier. Plusieurs personnes suggèrent de remplacer zcat par gzcat; Cependant, gzcat se plaint que le fichier n'est pas au format gzip!

'file' montre ceci: ... Zip archive data, au moins v2.0 à extraire

Donc, ni zcat ni gzcat ne fonctionneront dans osx, que puis-je faire?

J'ai un script de taille moyenne dans bash qui utilise, zcat / gzcat, sed awk et d'autres utilitaires de base pour traiter un certain nombre de fichiers. J'aimerais dupliquer cet environnement sur mon ordinateur portable osx afin de pouvoir travailler en mode hors connexion. Des suggestions générales comment je peux éviter une telle douleur? Je suppose que le flux de travail est assez routinier et doit donc avoir été réglé par d’autres.

utilisateur23398
la source
2
Si ce sont des données d'archive Zip, ce n'est pas au format gzip!
Michael Hampton
@ MichaelHampton je peux zcat sur linux bien. Ni zcat ni gzcat ne fonctionnent sur osx. Alors, comment puis-je résoudre ce problème? Existe-t-il un autre ensemble d’utilitaires que je peux installer et qui fonctionneront aussi bien sur linux que sur osx? Ces scripts sont les miens donc je peux les changer (bien que j'aimerais les garder simples). Je contrôle également les deux environnements linux / osx afin de pouvoir effectuer des installations simples sur les deux.
user23398
Je ne dirais pas que c'est la routine. J'utilise généralement zippour traiter les fichiers zip, pas gzip.
Michael Hampton

Réponses:

91

Tu as raison. C'est un comportement agaçant.

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

Essaye ça:

$ zcat < foo.txt.gz 
asdfadsf
vy32
la source
2
Cela fonctionne bien sous OS X.
Valerio Schiavoni
1
Apparemment, ma réponse est fausse. Linux zcatva lire .zipet les .Zfichiers. Le problème ici n’est pas celui du fichier stdin par rapport au fichier nommé, c’est que les responsables de Linux des programmes sont modifiés gzcatpour lire un grand nombre de types de fichiers non liés.
vy32
Comment pourrions-nous diriger cela vers un autre processus?
Petah
Utilisé |pour cat < foo.txt.gz | wc
diriger
Cela
résoudra
18

Je sais que c'est une vieille question. Cependant, j'ai trouvé une solution à partir d'un thread encore plus ancien de github .

Vous pouvez simplement utiliser ce gunzip -cqui fonctionne de manière similaire à zcatsans les erreurs sur Mac OS X.

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

Vous pouvez installer des utilitaires GNU pour Mac OS X, par exemple, en utilisant homebrew (run brew install coreutils gnu-sed, qui installe gzcatet autres. Et gsed). Cela vous fournira l’implémentation GNU de chaque commande.

Ensuite, pour vous simplifier la vie, créez une variable pour chaque commande (par exemple sed=gsed, et utilisez-la $sedpar la suite), ou simplement les alias (par exemple alias sed=gsed) dans n’importe quel script que vous écrivez. J'ai écrit un résumé sur ce sujet pour votre commodité: gnu-tools-for-mac.sh . Mettez (ou incluez) ce code au-dessus de vos scripts.

Utilisez l’implémentation GNU pour compresser et extraire les archives. Je dirais que vous ne pouvez pas mélanger les utilisations de l'implémentation OS X et GNU.

Peterino
la source
3
Vous pouvez également ajouter /usr/local/opt/coreutils/libexec/gnubinà votre PATH, ce qui les rend disponibles sans le gpréfixe.
bfontaine
3

Je viens d'essayer cela et j'ai trouvé quelque chose de très intéressant! Pour les gzfichiers, nous devons fonctionner gzcatsur Mac OS.

Solution 1

  • Utilisez gzcat /path/to/file.gzet cela devrait fonctionner.
  • L'utilisation zcat /path/to/file.gzvous donnera une erreur.

Solution 2

  • Pipe dans le fichier à zcatet cela fonctionnera.
  • Par exemple, cat /path/to/file.gz | zcattravaillera.

J'espère que ça aide!

Jigarius
la source
0

La version Mac OS X de gzip(1) ne prend pas en charge la lecture de fichiers zip . De la page de manuel:

Cette version de gzip est également capable de décompresser des fichiers compressés avec compress(1)ou bzip2(1).

Mais la version Linux (GNU) le fait .

gunzippeuvent les fichiers actuellement Décompressez créé par gzip, zip, compress, compress -Hou pack.

Des tiers ont fourni GNU gzip pour Mac OS X; vous pouvez les trouver à partir d'une recherche sur le Web. C'est probablement la voie de la moindre résistance.

Michael Hampton
la source
Rechercher sur le Web et installer un nouveau logiciel n’est jamais la voie de la moindre résistance.
vy32
0

Drôle, j'ai eu le même problème lors de l'exécution d'un bashscript bash somescript.sh, qui exécutait une boucle for à l' gzcatintérieur. Mais essayez ces choses à l' intérieur du somescript.shscript ...:

  1. zcat < file.txt.gz
  2. J'avais brew install coreutilsdéjà installé , mais néanmoins réinstallé:brew reinstall coreutils
  3. gunzip -c file.txt.gz

... ne valait rien ...

Mais j'ai aussi utilisé une référence à un répertoire:

SOMEDIR="~/DIR1/DIR2/DATA"

Ce qui est interprété comme ~/DIR1/DIR2/DATAet apparemment ne fonctionne pas dans le bashscript à l'intérieur macOS. Cela a fonctionné:

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

Ce qui est interprété comme /Users/someuser/DIR1/DIR2/DATA. Je ne sais pas pourquoi - je ne suis pas un expert de macOS-BASH-techie - mais cela fonctionnait en conjonction avec mon code d'origine ...

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

... dans mon somescript.shscript.

Peut-être que c'est utile à quelqu'un.

Meilleur,

Ponceuse

Sander W. van der Laan
la source