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.
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
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.
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.
gzcat /path/to/file.gz
et ça devrait marcher.zcat /path/to/file.gz
vous donnera une erreur.zcat
et cela fonctionnera.cat /path/to/file.gz | zcat
marchera.J'espère que ça aide!
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)
oubzip2(1)
.
Mais la version Linux (GNU) le fait .
gunzip
peut actuellement décompresser les fichiers créés pargzip
,Zip
,compress
,compress -H
oupack
.
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.
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 ...:
zcat < file.txt.gz
brew install coreutils
déjà, mais néanmoins réinstallé: brew reinstall coreutils
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