90 votes

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

Tout d'abord, le problème spécifique : Sous linux, j'utilise zcat pour lister un fichier .zip. Sous osx, zcat semble ajouter automatiquement .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 : ...Données de l'archive Zip, au moins v2.0 à extraire

Donc ni zcat ni gzcat ne fonctionnent sous osx, que puis-je faire ?

J'ai un script de taille moyenne en 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 hors ligne. Avez-vous des suggestions générales sur la façon d'éviter ce genre de problème ? Je suppose qu'il s'agit d'un flux de travail assez routinier et que d'autres personnes ont dû s'en occuper.

2 votes

Si ce sont des données d'archives Zip, c'est pas en format gzip !

0 votes

@MichaelHampton Je peux zcat sur linux sans problème. Ni zcat ni gzcat ne fonctionnent sur osx. Alors comment puis-je résoudre ce problème ? Y a-t-il un autre ensemble d'utilitaires que je peux installer et qui fonctionnera aussi bien sur linux que sur osx ? Ces scripts sont les miens donc je peux les modifier (bien que j'aimerais les garder simples). Je contrôle les deux environnements linux/osx également, donc je peux faire des installations simples sur les deux également.

0 votes

Je ne dirais pas que c'est la routine. J'utilise généralement zip pour traiter les fichiers zip, et non gzip .

154voto

vy32 Points 1918

Vous avez raison. C'est un comportement ennuyeux.

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

Essayez ça :

$ zcat < foo.txt.gz 
asdfadsf

5 votes

Cela fonctionne bien sous OS X.

2 votes

Apparemment, ma réponse est fausse. Linux zcat lira .zip y .Z fichiers. Le problème ici n'est pas celui de stdin contre un fichier nommé, c'est que les mainteneurs Linux des programmes ont modifié les fichiers de la base de données. gzcat pour lire un grand nombre de types de fichiers non liés.

1 votes

Comment faire passer cela dans un autre processus ?

38voto

syndre Points 21

Je sais que c'est une vieille question. Cependant, j'ai trouvé une solution dans un document encore plus ancien. Fil conducteur github .

Vous pouvez simplement utiliser gunzip -c qui fonctionne de manière similaire à zcat sans les erreurs sur Mac OS X.

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

0 votes

gzip pourrait fonctionner à la place de gunzip aussi.

20voto

Rick Childress Points 11

Vous pouvez installer GNU utils pour Mac OS X, par exemple homebrew (courir brew install coreutils gnu-sed qui installe gzcat et al. et gsed ). Vous obtiendrez ainsi l'implémentation GNU de chaque commande.

Ensuite, pour vous faciliter la vie, créez une variable pour chaque commande (par ex. sed=gsed et utiliser $sed par la suite), ou simplement les alias (par ex. alias sed=gsed ) dans tout script que vous écrivez. J'ai écrit un Gist sur ce sujet pour votre confort : gnu-tools-for-mac.sh . Mettez (ou incluez) ce code en haut de vos scripts.

Utilisez l'implémentation GNU pour la compression et l'extraction des archives. Je dirais que vous ne pouvez pas mélanger les utilisations de l'implémentation OS X et GNU.

3 votes

Vous pouvez également ajouter /usr/local/opt/coreutils/libexec/gnubin à votre PATH ce qui les rendra disponibles sans l'aide du g préfixe.

16voto

Jigarius Points 296

Je viens de faire un essai et j'ai trouvé quelque chose de très intéressant ! Pour gz nous sommes censés exécuter gzcat sur Mac OS.

Solution 1

  • Utilisez gzcat /path/to/file.gz et cela devrait fonctionner.
  • Utilisation de zcat /path/to/file.gz vous donnera une erreur.

Solution 2

  • Transférer le fichier vers zcat et ça marchera.
  • Par exemple, cat /path/to/file.gz | zcat fonctionnera.

J'espère que cela vous aidera !

2voto

Geek Points 111

Au lieu de

zcat filename.gz | grep "hello"

Utilisez

gunzip -c filename.gz | grep "hello"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X