zcat / gzcat funziona su Linux, non su osx. compatibilità generale linux / osx


50

Innanzitutto il problema specifico: in Linux, uso zcat per elencare un file .zip. In osx, zcat sembra aggiungere automaticamente .Z al nome del file. Varie persone suggeriscono di sostituire zcat con gzcat; comunque, gzcat si lamenta che il file non è in formato gzip!

'file' mostra questo: ... Dati di archivio zip, almeno v2.0 da estrarre

Quindi né zcat né gzcat funzioneranno in osx, cosa posso fare?

Ho uno script di medie dimensioni in bash che utilizza, zcat / gzcat, sed awk e altre utilità di base per elaborare un numero di file. Vorrei duplicare quell'ambiente sul mio laptop osx in modo da poter lavorare offline. Qualche suggerimento generale su come posso evitare un tale dolore? Mi aspetto che questo sia un flusso di lavoro abbastanza normale, quindi deve essere stato risolto da altri.


2
Se si tratta di dati di archivio Zip, non è in formato gzip!
Michael Hampton

@MichaelHampton Posso zcat su Linux bene. Né zcat né gzcat funzionano su osx. Quindi, come posso risolvere questo? C'è un altro set di utility che posso installare che funzionerà sia su Linux che su OSX? Questi script sono miei, quindi posso cambiarli (anche se mi piacerebbe renderli semplici). Controllo anche gli ambienti linux / osx, quindi posso fare anche semplici installazioni su entrambi.
user23398,

Non direi che è una routine. In genere lo uso zipper gestire i file zip, non gzip.
Michael Hampton

Risposte:


90

Hai ragione. È un comportamento fastidioso.

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

Prova questo:

$ zcat < foo.txt.gz 
asdfadsf

2
Funziona bene su OS X.
Valerio Schiavoni

1
Apparentemente la mia risposta è sbagliata. Linux zcatleggerà .zipe .Zfile. Il problema qui non è uno dei file stdin vs. named, è che i manutentori Linux dei programmi modificati gzcatper leggere un gran numero di tipi di file non correlati.
vy32

Come possiamo inoltrarlo a un altro processo?
Petah,

Utilizzare |per cat < foo.txt.gz | wc
convogliare

Questo risolverà il tuo problema, almeno su OSX
jimh

18

So che questa è una vecchia domanda. Tuttavia, ho trovato una soluzione da un thread github ancora più vecchio .

Puoi semplicemente usare gunzip -cquello che funziona in modo simile zcatsenza errori su Mac OS X.

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

13

Puoi installare GNU utils per Mac OS X, ad es. Usando homebrew (esegui brew install coreutils gnu-sed, che installa gzcatet al. E gsed). Questo ti fornirà l'implementazione GNU di ogni comando.

Quindi, per semplificarti la vita, crea una variabile per ciascun comando (ad es sed=gsed. E utilizzalo $sedsuccessivamente), o semplicemente alias (ad es. alias sed=gsed) In qualsiasi script che scrivi. Ho scritto un Gist su questo per tua comodità: gnu-tools-for-mac.sh . Inserisci (o includi) questo codice in cima ai tuoi script.

Utilizzare l'implementazione GNU sia per comprimere che per estrarre gli archivi. Direi che non puoi mescolare gli usi dell'implementazione di OS X e GNU.


3
In alternativa puoi aggiungere /usr/local/opt/coreutils/libexec/gnubinal tuo PATH, che li renderà disponibili senza il gprefisso.
bfontaine,

3

Ho appena provato e ho trovato qualcosa di molto interessante! Per i gzfile, dovremmo essere eseguiti gzcatsu Mac OS.

Soluzione 1

  • Usa gzcat /path/to/file.gze dovrebbe funzionare.
  • L'uso zcat /path/to/file.gzti darà un errore.

Soluzione 2

  • Installa il file zcate funzionerà.
  • Ad esempio, cat /path/to/file.gz | zcatfunzionerà.

Spero che questo possa essere d'aiuto!


0

La versione di Mac OS X di gzip(1) non supporta la lettura di file zip . Dalla pagina man:

Questa versione di gzip è anche in grado di decomprimere i file compressi usando compress(1)o bzip2(1).

Ma la versione di Linux (GNU) lo fa .

gunzippossono file attualmente Decomprimere creato da gzip, zip, compress, compress -Ho pack.

Terze parti hanno impacchettato GNU gzip per Mac OS X; puoi trovarli da una ricerca web. Questo è probabilmente il percorso di minor resistenza.


La ricerca sul Web e l'installazione di nuovi software non è mai il percorso di minor resistenza.
vy32,

0

Divertente, ho avuto lo stesso problema durante l'esecuzione di un bash-script bash somescript.sh, che ha eseguito un for-loop con gzcatal suo interno. Ma provando queste cose all'interno dello somescript.shscript ...:

  1. zcat < file.txt.gz
  2. Avevo brew install coreutilsgià installato , ma comunque reinstallato:brew reinstall coreutils
  3. gunzip -c file.txt.gz

... non ammontava a nulla ...

Ma ho anche usato un riferimento a una directory:

SOMEDIR="~/DIR1/DIR2/DATA"

Che è interpretato come ~/DIR1/DIR2/DATAe apparentemente non funziona all'interno dello bashscript all'interno macOS. Questo ha funzionato:

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

Che viene interpretato come /Users/someuser/DIR1/DIR2/DATA. Non so perché - non sono un esperto macOS-BASH-techie - ma ha funzionato insieme al mio codice originale ...

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

... nel mio somescript.shscript.

Forse è utile a qualcuno.

Migliore,

Levigatrice

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.