web-dev-qa-db-fra.com

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

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. Diverses personnes suggèrent de remplacer zcat par gzcat; cependant, gzcat se plaint que le fichier n'est pas au format gzip!

'fichier' montre ceci: ... Zip archive les données, au moins v2.0 pour extraire

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

J'ai un script de taille moyenne dans in bash qui utilise, zcat/gzcat, sed awk et d'autres utilitaires de base pour traiter un certain nombre de fichiers. Je voudrais dupliquer cet environnement sur mon ordinateur portable osx afin de pouvoir travailler hors ligne. Des suggestions générales sur la façon d'éviter une telle douleur? Je m'attends à ce qu'il s'agisse d'un flux de travail assez routinier, il a donc dû être réglé par d'autres.

56
user23398

Tu as 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

Essaye ça:

$ zcat < foo.txt.gz 
asdfadsf
98
vy32

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

Vous pouvez simplement utiliser gunzip -c qui fonctionne de façon similaire à zcat sans les erreurs sur Mac OS X.

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

Vous pouvez installer GNU utils pour Mac OS X, par exemple, en utilisant homebrew (exécutez brew install coreutils gnu-sed, qui installe gzcat et al. et gsed). Cela vous fournira l'implémentation GNU de chaque commande.

Ensuite, pour vous faciliter la vie, créez une variable pour chaque commande (par exemple sed=gsed, et utilise $sed par la suite), ou simplement les alias (par exemple alias sed=gsed) dans n'importe quel script que vous écrivez. J'ai écrit un Gist à 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'OS X et de l'implémentation GNU.

13
Peterino

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

Solution 1

  • Utilisation gzcat /path/to/file.gz et ça devrait marcher.
  • En utilisant zcat /path/to/file.gz vous donnera une erreur.

Solution 2

  • Dirigez le fichier vers zcat et cela fonctionnera.
  • Par exemple, cat /path/to/file.gz | zcat marchera.

J'espère que ça aide!

4
Jigarius

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

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

Mais la version Linux (GNU) le fait .

gunzip peut actuellement décompresser les fichiers créés par gzip, Zip, compress, compress -H ou pack.

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

0
Michael Hampton

C'est drôle, j'ai eu le même problème lors de l'exécution d'un script bash-, bash somescript.sh, qui a exécuté une boucle for avec gzcat à l'intérieur. Mais essayer ces choses à l'intérieur le somescript.sh- script ...:

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

... ne représentait rien ...

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

SOMEDIR="~/DIR1/DIR2/DATA"

Ce qui est interprété comme ~/DIR1/DIR2/DATA et ne fonctionne apparemment pas dans le script bash- dans 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 en macOS-BASH - mais cela a fonctionné en conjonction avec mon code d'origine ...

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

... à l'intérieur mon somescript.sh-scénario.

C'est peut-être utile à quelqu'un.

Meilleur,

Sander

0