zcat / gzcat hoạt động trong linux, không phải trên osx. tương thích linux / osx


50

Đầu tiên là vấn đề cụ thể: Trong linux, tôi sử dụng zcat để liệt kê một tệp .zip. Trong osx, zcat dường như tự động thêm .Z vào tên tệp. Nhiều người đề nghị thay thế zcat bằng gzcat; tuy nhiên, gzcat phàn nàn rằng tệp không ở định dạng gzip!

'tập tin' hiển thị điều này: ... Dữ liệu lưu trữ zip, ít nhất là v2.0 để giải nén

Vì vậy, cả zcat hay gzcat đều không hoạt động trong osx, tôi có thể làm gì?

Tôi có một tập lệnh có kích thước trung bình trong bash sử dụng, zcat / gzcat, sed awk và các tiện ích cơ bản khác để xử lý một số tệp. Tôi muốn sao chép môi trường đó trên máy tính xách tay osx của mình để tôi có thể làm việc ngoại tuyến. Bất kỳ đề nghị chung làm thế nào tôi có thể tránh được nỗi đau như vậy? Tôi hy vọng đây là một quy trình công việc khá thường xuyên vì vậy phải được sắp xếp bởi những người khác.


2
Nếu đó là dữ liệu lưu trữ Zip, thì nó không ở định dạng gzip!
Michael Hampton

@MichaelHampton Tôi có thể zcat trên linux tốt. Cả zcat và gzcat đều không hoạt động trên osx. Vì vậy, làm thế nào tôi có thể giải quyết điều này? Có một bộ tiện ích nào khác mà tôi có thể cài đặt sẽ hoạt động cả trên linux cũng như osx không? Các kịch bản này là của riêng tôi để tôi có thể thay đổi chúng (mặc dù tôi muốn giữ chúng đơn giản). Tôi cũng kiểm soát cả môi trường linux / osx vì vậy tôi cũng có thể cài đặt đơn giản trên cả hai.
dùng23398

Tôi sẽ không nói đó là thói quen. Tôi thường sử dụng zipđể đối phó với các tập tin zip, không gzip.
Michael Hampton

Câu trả lời:


89

Bạn đúng rồi. Đó là hành vi gây phiền nhiễu.

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

Thử đi:

$ zcat < foo.txt.gz 
asdfadsf

2
Điều này hoạt động tốt trên OS X.
Valerio Schiavoni

1
Rõ ràng câu trả lời của tôi là sai. Linux zcatsẽ đọc .zip.Ztập tin. Vấn đề ở đây không phải là một trong những stdin so với tệp được đặt tên, đó là các nhà duy trì Linux của các chương trình được sửa đổi gzcatđể đọc một số lượng lớn các loại tệp không liên quan.
vy32

Làm thế nào chúng ta sẽ dẫn điều này đến một quá trình khác?
Petah

Sử dụng |để chuyển sang quy trình khác:cat < foo.txt.gz | wc
vy32

Điều này sẽ khắc phục vấn đề của bạn, ít nhất là trên OSX
jimh

18

Tôi biết đây là một câu hỏi cũ. Tuy nhiên, tôi đã tìm thấy một giải pháp từ một chủ đề github thậm chí cũ hơn .

Bạn chỉ có thể sử dụng gunzip -choạt động tương tự zcatmà không có lỗi trên Mac OS X.

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

13

Bạn có thể cài đặt các tiện ích GNU cho Mac OS X, ví dụ: bằng cách sử dụng homebrew (chạy brew install coreutils gnu-sed, cài đặt gzcatet al. Và gsed). Điều này sẽ cung cấp cho bạn việc triển khai GNU của mỗi lệnh.

Sau đó, để làm cho cuộc sống của bạn dễ dàng hơn, hãy tạo một biến cho mỗi lệnh (ví dụ: sed=gsedvà sử dụng $sedsau đó) hoặc đơn giản là bí danh chúng (ví dụ alias sed=gsed) trong bất kỳ tập lệnh nào bạn viết. Tôi đã viết một ý chính về điều này để thuận tiện cho bạn: gnu-tools-for-mac.sh . Đặt (hoặc bao gồm) mã này lên trên các tập lệnh của bạn.

Sử dụng triển khai GNU cho cả nén và trích xuất tài liệu lưu trữ. Tôi muốn nói rằng bạn không thể trộn lẫn việc sử dụng triển khai OS X và GNU.


3
Bạn có thể thay thế thêm /usr/local/opt/coreutils/libexec/gnubinvào PATH, cái này sẽ làm cho chúng có sẵn mà không cần gtiền tố.
bfontaine

3

Tôi chỉ thử cái này và thấy một cái gì đó rất thú vị! Đối với gzcác tệp, chúng tôi dự kiến ​​sẽ chạy gzcattrên Mac OS.

Giải pháp 1

  • Sử dụng gzcat /path/to/file.gzvà nó sẽ làm việc.
  • Sử dụng zcat /path/to/file.gzsẽ cung cấp cho bạn một lỗi.

Giải pháp 2

  • Ống trong tập tin zcatvà nó sẽ làm việc.
  • Ví dụ, cat /path/to/file.gz | zcatsẽ làm việc.

Tôi hi vọng cái này giúp được!


0

Phiên bản Mac OS X gzip(1) không hỗ trợ đọc tệp zip . Từ trang người đàn ông:

Phiên bản gzip này cũng có khả năng giải nén các tệp được nén bằng compress(1)hoặc bzip2(1).

Nhưng phiên bản Linux (GNU) thì có .

gunzipfile hiện giải nén có thể được tạo ra bởi gzip, zip, compress, compress -Hhoặc pack.

Các bên thứ ba đã đóng gói GNU gzip cho Mac OS X; bạn có thể tìm thấy những thứ này từ một tìm kiếm trên web. Đó có lẽ là con đường ít kháng cự nhất.


Tìm kiếm trên web và cài đặt phần mềm mới không bao giờ là con đường ít kháng cự nhất.
vy32

0

Thật buồn cười, tôi đã gặp vấn đề tương tự khi thực hiện một bash-cript bash somescript.sh, trong đó thực thi một vòng lặp for gzcatbên trong nó. Nhưng hãy thử những điều này trong phần mô tả somescript.sh...:

  1. zcat < file.txt.gz
  2. Tôi đã cài đặt brew install coreutils, nhưng dù sao, đã cài đặt lại:brew reinstall coreutils
  3. gunzip -c file.txt.gz

... không có gì ...

Nhưng tôi cũng đã sử dụng một tham chiếu đến một thư mục:

SOMEDIR="~/DIR1/DIR2/DATA"

Điều này được hiểu là ~/DIR1/DIR2/DATAvà dường như không hoạt động trong phần mô tả bashbên trong macOS. Điều này đã làm việc:

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

Mà được hiểu là /Users/someuser/DIR1/DIR2/DATA. Tôi không biết tại sao - Tôi không phải là chuyên gia macOS-BASH-techie - nhưng nó hoạt động cùng với mã gốc của tôi ...

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

... trong phần mô tả của tôi somescript.sh.

Có lẽ nó hữu ích cho ai đó.

Tốt,

Máy đánh bóng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.