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.
zip
pour traiter les fichiers zip, pasgzip
.Réponses:
Tu as raison. C'est un comportement agaçant.
Essaye ça:
la source
zcat
va lire.zip
et les.Z
fichiers. 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ésgzcat
pour lire un grand nombre de types de fichiers non liés.|
pourcat < foo.txt.gz | wc
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 -c
qui fonctionne de manière similaire àzcat
sans les erreurs sur Mac OS X.la source
Vous pouvez installer des utilitaires GNU pour Mac OS X, par exemple, en utilisant homebrew (run
brew install coreutils gnu-sed
, qui installegzcat
et autres. Etgsed
). 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$sed
par la suite), ou simplement les alias (par exemplealias 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.
la source
/usr/local/opt/coreutils/libexec/gnubin
à votrePATH
, ce qui les rend disponibles sans leg
préfixe.Je viens d'essayer cela et j'ai trouvé quelque chose de très intéressant! Pour les
gz
fichiers, nous devons fonctionnergzcat
sur Mac OS.Solution 1
gzcat /path/to/file.gz
et cela devrait fonctionner.zcat /path/to/file.gz
vous donnera une erreur.Solution 2
zcat
et cela fonctionnera.cat /path/to/file.gz | zcat
travaillera.J'espère que ça aide!
la source
La version Mac OS X de
gzip(1)
ne prend pas en charge la lecture de fichiers zip . De la page de manuel:Mais la version Linux (GNU) le fait .
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.
la source
Drôle, j'ai eu le même problème lors de l'exécution d'un
bash
scriptbash somescript.sh
, qui exécutait une boucle for à l'gzcat
intérieur. Mais essayez ces choses à l' intérieur dusomescript.sh
script ...:zcat < file.txt.gz
brew install coreutils
déjà installé , mais néanmoins réinstallé:brew reinstall coreutils
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/DATA
et apparemment ne fonctionne pas dans lebash
script à l'intérieurmacOS
. 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.sh
script.Peut-être que c'est utile à quelqu'un.
Meilleur,
Ponceuse
la source