zcat / gzcat ทำงานใน linux ไม่ใช่ใน osx ความเข้ากันได้ทั่วไปของ linux / osx


50

แรกปัญหาเฉพาะ: ใน linux ฉันใช้ zcat เพื่อแสดงรายการไฟล์. zip ใน osx, zcat ดูเหมือนจะผนวก. Z เข้ากับชื่อไฟล์โดยอัตโนมัติ หลายคนแนะนำให้เปลี่ยน zcat ด้วย gzcat อย่างไรก็ตาม, gzcat บ่นว่าไฟล์ไม่ได้อยู่ในรูปแบบ gzip!

'file' แสดงสิ่งนี้: ... Zip data data อย่างน้อย v2.0 ที่จะแยกออกมา

ดังนั้น zcat หรือ gzcat จะไม่ทำงานใน osx ฉันควรทำอย่างไร

ฉันมีสคริปต์ขนาดกลางในในทุบตีซึ่งใช้ zcat / gzcat, sed awk และสาธารณูปโภคขั้นพื้นฐานอื่น ๆ ในการประมวลผลจำนวนไฟล์ ฉันต้องการทำซ้ำสภาพแวดล้อมนั้นบนแล็ปท็อป osx ของฉันเพื่อให้ฉันสามารถทำงานแบบออฟไลน์ คำแนะนำทั่วไปฉันจะหลีกเลี่ยงความเจ็บปวดได้อย่างไร? ฉันคาดหวังว่านี่เป็นขั้นตอนการทำงานที่ค่อนข้างเป็นประจำดังนั้นคนอื่น ๆ จึงต้องถูกแยกออก


2
หากเป็นข้อมูลไฟล์ Zip ก็ไม่ได้อยู่ในรูปแบบ gzip!
Michael Hampton

@MichaelHampton ฉันสามารถ zcat บน linux ได้ zcat หรือ gzcat ไม่ทำงานบน osx ดังนั้นฉันจะแก้ไขปัญหานี้ได้อย่างไร มีชุดเครื่องมืออื่นที่ฉันสามารถติดตั้งได้ซึ่งจะใช้งานได้ทั้งบน linux และ osx หรือไม่? สคริปต์เหล่านี้เป็นของฉันเองดังนั้นฉันจึงสามารถเปลี่ยนได้ (แม้ว่าฉันจะต้องการให้มันง่าย) ฉันควบคุมสภาพแวดล้อมทั้ง linux / osx ด้วยดังนั้นฉันสามารถติดตั้งได้ง่ายทั้งบนและล่าง
user23398

ฉันจะไม่พูดว่ามันเป็นกิจวัตร ฉันมักจะใช้ในการจัดการกับไฟล์ซิปไม่zip gzip
Michael Hampton

คำตอบ:


89

คุณพูดถูก มันเป็นพฤติกรรมที่น่ารำคาญ

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

ลองสิ่งนี้:

$ zcat < foo.txt.gz 
asdfadsf

2
สิ่งนี้ใช้ได้บน OS X.
Valerio Schiavoni

1
เห็นได้ชัดว่าคำตอบของฉันไม่ถูกต้อง Linux zcatจะอ่าน.zipและ.Zไฟล์ ปัญหาที่นี่ไม่ใช่ไฟล์ stdin vs. ชื่อ แต่เป็นไฟล์ที่ผู้ดูแลระบบ Linux ของโปรแกรมที่แก้ไขgzcatเพื่ออ่านไฟล์ประเภทที่ไม่เกี่ยวข้องจำนวนมาก
vy32

เราจะทำให้กระบวนการนี้เป็นกระบวนการอื่นได้อย่างไร
Petah

ใช้|เพื่อcat < foo.txt.gz | wc
ไพพ์

วิธีนี้จะแก้ไขปัญหาของคุณอย่างน้อยใน OSX
jimh

18

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ผมพบวิธีแก้ปัญหาจากแม้เก่าด้าย GitHub

คุณสามารถใช้gunzip -cงานได้คล้ายกับzcatไม่มีข้อผิดพลาดใน Mac OS X

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

13

คุณสามารถติดตั้ง GNU utils สำหรับ Mac OS X เช่นใช้homebrew (เรียกใช้brew install coreutils gnu-sedซึ่งติดตั้งgzcatet al. และgsed) สิ่งนี้จะช่วยให้คุณมีการนำ GNU ไปใช้ของแต่ละคำสั่ง

จากนั้นเพื่อทำให้ชีวิตของคุณง่ายขึ้นให้สร้างตัวแปรสำหรับแต่ละคำสั่ง (เช่นsed=gsedและใช้ใน$sedภายหลัง) หรือเพียงแค่ใช้นามแฝง (เช่นalias sed=gsed) ในสคริปต์ใด ๆ ที่คุณเขียน ผมเคยเขียนสรุปสาระสำคัญกับเรื่องนี้เพื่อความสะดวกของคุณ: gnu-tools-for-mac.sh ใส่ (หรือรวม) รหัสนี้ที่ด้านบนของสคริปต์ของคุณ

ใช้การนำ GNU ไปใช้สำหรับทั้งการบีบอัดและการแตกไฟล์เก็บถาวร ฉันว่าคุณไม่สามารถผสมผสานการใช้งานของ OS X และ GNU ได้


3
คุณสามารถเพิ่มลง/usr/local/opt/coreutils/libexec/gnubinในของคุณPATHซึ่งจะทำให้ใช้ได้โดยไม่มีgคำนำหน้า
bfontaine

3

ฉันลองทำดูและพบสิ่งที่น่าสนใจมาก! สำหรับgzไฟล์เราคาดว่าจะทำงานgzcatบน Mac OS

โซลูชันที่ 1

  • ใช้gzcat /path/to/file.gzและควรใช้งานได้
  • การใช้zcat /path/to/file.gzจะทำให้คุณมีข้อผิดพลาด

โซลูชันที่ 2

  • ไปป์ในไฟล์zcatและจะใช้งานได้
  • ตัวอย่างเช่นcat /path/to/file.gz | zcatจะทำงาน

ฉันหวังว่านี่จะช่วยได้!


0

รุ่น Mac OS X ของไม่รองรับการอ่านไฟล์ซิปgzip(1) จากหน้าคน:

รุ่นนี้gzipยังสามารถคลายไฟล์บีบอัดโดยใช้หรือcompress(1)bzip2(1)

แต่ลินุกซ์ (GNU) เวอร์ชั่นไม่

gunzipขณะนี้สามารถขยายขนาดไฟล์ที่สร้างขึ้นโดยgzip, zip, compress, หรือcompress -Hpack

บุคคลที่สามมีแพ็คเกจ GNU gzip สำหรับ Mac OS X คุณสามารถค้นหาสิ่งเหล่านี้ได้จากการค้นหาเว็บ นั่นอาจเป็นเส้นทางของความต้านทานน้อยที่สุด


การค้นหาเว็บและติดตั้งซอฟต์แวร์ใหม่จะไม่เป็นหนทางต้านทานน้อยที่สุด
vy32

0

ตลกฉันมีปัญหาเดียวกันเมื่อรันbash-script bash somescript.shซึ่งดำเนินการ for-loop ด้วยgzcatภายใน แต่พยายามทำสิ่งเหล่านี้ภายในsomescript.sh -script ...

  1. zcat < file.txt.gz
  2. ฉันได้ติดตั้งbrew install coreutilsไปแล้ว แต่กระนั้นติดตั้งใหม่:brew reinstall coreutils
  3. gunzip -c file.txt.gz

... ไม่มีอะไรเลย ...

แต่ฉันยังใช้การอ้างอิงไปยังไดเรกทอรี:

SOMEDIR="~/DIR1/DIR2/DATA"

ซึ่งถูกตีความว่าเป็น~/DIR1/DIR2/DATAและเห็นได้ชัดไม่ทำงานภายในbash-script macOSภายใน สิ่งนี้ได้ผล:

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

/Users/someuser/DIR1/DIR2/DATAซึ่งถูกตีความว่าเป็น ฉันไม่รู้ว่าทำไม - ฉันไม่ใช่ผู้เชี่ยวชาญ macOS-BASH-techie - แต่มันทำงานร่วมกับรหัสดั้งเดิมของฉัน ...

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

... ภายในsomescript.sh -script ของฉัน

อาจเป็นประโยชน์กับบางคน

ที่ดีที่สุด

ซานเดอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.