zcat / gzcat працює в Linux, а не на OSX. загальна сумісність Linux / OSX


50

По-перше, конкретна проблема: в Linux я використовую zcat для переліку .zip-файлу. У OSX, схоже, zcat автоматично додає .Z до імені файлу. Різні люди пропонують замінити zcat на gzcat; однак gzcat скаржиться, що файл не у форматі gzip!

'файл' показує це: ... Дані архіву Zip, принаймні v2.0 для вилучення

Тож ні zcat, ні gzcat не працюватимуть у OSX, що я можу зробити?

У мене є скрипт середнього розміру в bash, який використовує, zcat / gzcat, sed awk та інші основні утиліти для обробки кількох файлів. Я хотів би скопіювати це середовище на своєму ноутбуку Osx, щоб я міг працювати в автономному режимі. Будь-які загальні пропозиції, як я можу уникнути такого болю? Я думаю, що це досить рутинний робочий процес, тому, мабуть, їх розібрали інші.


2
Якщо це дані архіву Zip, вони не у форматі gzip!
Майкл Хемптон

@MichaelHampton Я можу zcat на Linux добре. Ні zcat, ні gzcat не працюють на osx. То як я можу це вирішити? Чи є інший набір утиліт, які я можу встановити, які будуть працювати як на Linux, так і на OSX? Ці сценарії є моїми власними, тому я можу їх змінити (хоча я хотів би зробити їх простими). Я також керую обома середовищами linux / osx, так що я можу робити прості установки і на обох.
user23398

Я б не сказав, що це звичайно. Як правило, я zipпрацюю з поштовими файлами, ні gzip.
Майкл Хемптон

Відповіді:


90

Ти правий. Це дратівлива поведінка.

$ 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
Це працює нормально на ОС X.
Валеріо Скіавоні

1
Мабуть, моя відповідь неправильна. Linux zcatбуде читати .zipі .Zфайли. Проблема тут не одна із файлів stdin vs. name, це те, що сервіси Linux, які модифікували програми, gzcatчитали велику кількість непов'язаних типів файлів.
vy32

Як би ми передали це іншому процесу?
Петах

Використовуйте |для передачі іншого процесу:cat < foo.txt.gz | wc
vy32

Це вирішить вашу проблему, принаймні на OSX
jimh

18

Я знаю, це старе питання. Однак я знайшов рішення з ще старшої нитки Github .

Ви можете просто використовувати gunzip -cте, що працює аналогічно zcatбез помилок у Mac OS X.

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

13

Ви можете встановити утиліти GNU для Mac OS X, наприклад, за допомогою homebrew (запустити brew install coreutils gnu-sed, який встановлює gzcatта ін. Та gsed). Це забезпечить вам реалізацію GNU кожної команди.

Потім, щоб полегшити ваше життя, зробіть змінну для кожної команди (наприклад sed=gsed, і використовуйте $sedзгодом) або просто псевдонімом (наприклад alias sed=gsed) у будь-якому написаному вами сценарії. Я написав історію про це для вашої зручності: gnu-tools-for-mac.sh . Покладіть (або включіть) цей код поверх своїх сценаріїв.

Використовуйте реалізацію GNU як для стискання, так і для вилучення архівів. Я б сказав, що ви не можете змішувати використання ОС X 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).

Але версія Linux (GNU) є .

gunzipв даний час може розпаковувати файли , створені з допомогою gzip, zip, compress, compress -Hабо pack.

Треті сторони упакували GNU gzip для Mac OS X; їх можна знайти за допомогою веб-пошуку. Це, мабуть, шлях найменшого опору.


Пошук в Інтернеті та встановлення нового програмного забезпечення ніколи не є шляхом найменшого опору.
vy32

0

Смішно, у мене був той самий випуск при виконанні bash-script bash somescript.sh, який виконував for-цикл із 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-скрипту.

Можливо, комусь це корисно.

Найкраще,

Сандер

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.