zcat / gzcat berfungsi di linux, bukan di osx. kompatibilitas linux / osx umum

50

Pertama masalah spesifik: Di linux, saya menggunakan zcat untuk mendaftar file .zip. Di osx, zcat tampaknya secara otomatis menambahkan .Z ke nama file. Berbagai orang menyarankan mengganti zcat dengan gzcat; namun, gzcat mengeluh bahwa file tersebut tidak dalam format gzip!

'file' menunjukkan ini: ... Zip arsip data, setidaknya v2.0 untuk diekstraksi

Jadi, baik zcat atau gzcat tidak akan berfungsi di osx, apa yang bisa saya lakukan?

Saya memiliki skrip berukuran sedang di dalam bash yang menggunakan, zcat / gzcat, sed awk dan utilitas dasar lainnya untuk memproses sejumlah file. Saya ingin menduplikasi lingkungan itu di laptop osx saya sehingga saya dapat bekerja offline. Adakah saran umum bagaimana saya dapat menghindari rasa sakit seperti itu? Saya berharap ini adalah alur kerja yang cukup rutin sehingga harus diselesaikan oleh orang lain.

pengguna23398
sumber
2
Jika ini adalah data arsip Zip, ini bukan dalam format gzip!
Michael Hampton
@MichaelHampton aku bisa zcat di linux dengan baik. Baik zcat maupun gzcat tidak berfungsi di osx. Jadi bagaimana saya bisa menyelesaikan ini? Apakah ada satu set utilitas yang dapat saya instal yang akan berfungsi baik di linux maupun osx? Skrip ini adalah milik saya sehingga saya dapat mengubahnya (walaupun saya ingin membuatnya tetap sederhana). Saya mengontrol kedua lingkungan linux / osx juga sehingga saya dapat melakukan instalasi sederhana pada keduanya juga.
user23398
Saya tidak akan mengatakan ini rutin. Saya biasanya menggunakan zipuntuk menangani file zip, bukan gzip.
Michael Hampton

Jawaban:

90

Kamu benar. Itu perilaku yang menjengkelkan.

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

Coba ini:

$ zcat < foo.txt.gz 
asdfadsf
ay32
sumber
2
Ini berfungsi dengan baik pada OS X.
Valerio Schiavoni
1
Ternyata jawaban saya salah. Linux zcatakan membaca .zipdan .Zmengarsipkan. Masalahnya di sini bukan salah satu dari file stdin vs bernama, itu adalah pengelola Linux dari program yang dimodifikasi gzcatuntuk membaca sejumlah besar jenis file yang tidak terkait.
vy32
Bagaimana kita menyalurkan ini ke proses lain?
Petah
Gunakan |untuk menyalurkan ke proses lain:cat < foo.txt.gz | wc
vy32
Ini akan memperbaiki masalah Anda, setidaknya pada OSX
jimh
18

Saya tahu ini adalah pertanyaan lama. Namun, saya menemukan solusi dari utas github yang bahkan lebih tua .

Anda cukup menggunakan gunzip -cyang berfungsi serupa dengan zcattanpa kesalahan pada Mac OS X.

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

Anda dapat menginstal utils GNU untuk Mac OS X, misalnya, menggunakan homebrew (run brew install coreutils gnu-sed, yang menginstal gzcatet al. Dan gsed). Ini akan memberi Anda implementasi GNU dari setiap perintah.

Kemudian, untuk membuat hidup Anda lebih mudah, buat variabel untuk setiap perintah (misalnya sed=gsed, dan gunakan $sedselanjutnya), atau cukup beri nama (misalnya alias sed=gsed) dalam skrip apa pun yang Anda tulis. Saya telah menulis inti tentang ini untuk kenyamanan Anda: gnu-tools-for-mac.sh . Letakkan (atau sertakan) kode ini di atas skrip Anda.

Gunakan implementasi GNU untuk mengompresi dan mengekstraksi arsip. Saya akan mengatakan Anda tidak dapat mencampur penggunaan OS X dan implementasi GNU.

Peterino
sumber
3
Anda juga dapat menambahkan /usr/local/opt/coreutils/libexec/gnubinke Anda PATH, yang akan membuatnya tersedia tanpa gawalan.
bfontaine
3

Saya baru saja mencoba ini dan menemukan sesuatu yang sangat menarik! Untuk gzfile, kita diharapkan berjalan gzcatdi Mac OS.

Solusi 1

  • Gunakan gzcat /path/to/file.gzdan itu harus bekerja.
  • Menggunakan zcat /path/to/file.gzakan memberi Anda kesalahan.

Solusi 2

  • Pipa dalam file ke zcatdan itu akan berhasil.
  • Misalnya cat /path/to/file.gz | zcatakan bekerja.

Saya harap ini membantu!

Jigarius
sumber
0

Versi Mac OS X gzip(1) tidak mendukung membaca file zip . Dari halaman manual:

Versi gzip ini juga mampu mendekompresi file yang dikompres menggunakan compress(1)atau bzip2(1).

Tetapi versi Linux (GNU) tidak .

gunzipfile saat dekompresi dapat diciptakan oleh gzip, zip, compress, compress -Hatau pack.

Pihak ketiga telah memaket GNU gzip untuk Mac OS X; Anda dapat menemukannya dari pencarian web. Itu mungkin jalan paling sedikit perlawanan.

Michael Hampton
sumber
Mencari web dan menginstal perangkat lunak baru tidak pernah jalur yang paling perlawanan.
vy32
0

Lucu, saya punya masalah yang sama ketika mengeksekusi bash-script bash somescript.sh,, yang mengeksekusi for-loop dengan gzcatdi dalamnya. Tetapi mencoba hal-hal ini di dalam somescript.sh-script ...:

  1. zcat < file.txt.gz
  2. Saya sudah menginstal brew install coreutils, tetapi tetap menginstal ulang:brew reinstall coreutils
  3. gunzip -c file.txt.gz

... sama sekali tidak ada ...

Tapi saya juga menggunakan referensi ke direktori:

SOMEDIR="~/DIR1/DIR2/DATA"

Yang ditafsirkan sebagai ~/DIR1/DIR2/DATAdan tampaknya tidak bekerja di dalam bash-script dalam macOS. Ini berhasil:

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

Yang diartikan sebagai /Users/someuser/DIR1/DIR2/DATA. Saya tidak tahu mengapa - saya bukan ahli macOS-BASH-techie - tetapi bekerja bersama dengan kode asli saya ...

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

... dalamsomescript.sh skrip saya .

Mungkin bermanfaat bagi seseorang.

Terbaik,

Sander

Sander W. van der Laan
sumber