zcat / gzcat работает в linux, а не в osx. общая совместимость с Linux / OSX

51

Сначала конкретная проблема: в linux я использую zcat для отображения файла .zip. В osx zcat, кажется, автоматически добавляет .Z к имени файла. Различные люди предлагают заменить zcat на gzcat; однако, gzcat жалуется, что файл не в формате gzip!

'file' показывает это: ... Zip архив данных, по крайней мере v2.0 для извлечения

Так что ни zcat, ни gzcat не будут работать в osx, что мне делать?

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

user23398
источник
2
Если это данные архива Zip, то они не в формате gzip!
Майкл Хэмптон
@MichaelHampton Я могу нормально кататься на Linux. Ни zcat, ни gzcat не работают на osx. Так как я могу решить это? Могу ли я установить другой набор утилит, который будет работать как на Linux, так и на OSX? Эти скрипты являются моими собственными, поэтому я могу их изменить (хотя я бы хотел, чтобы они были простыми). Я также управляю обеими средами linux / osx, поэтому могу выполнять простую установку и на обоих.
user23398
Я бы не сказал, что это рутина. Я обычно использую, zipчтобы иметь дело с почтовыми файлами, не gzip.
Майкл Хэмптон

Ответы:

91

Ты прав. Это раздражающее поведение.

$ 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
vy32
источник
2
Это работает нормально на OS X.
Валерио Скьявони
1
Видимо мой ответ неверный. Линукс zcatбудет читать .zipи .Zфайлы. Проблема здесь не в том, что stdin vs named file, а в том, что сопровождающие Linux программ изменяются gzcatдля чтения большого числа несвязанных типов файлов.
vy32 04.04.15
Как бы мы передали это другому процессу?
Петах
Используйте |для 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
dakdad
источник
13

Вы можете установить утилиты GNU для Mac OS X, например, используя homebrew (запустите brew install coreutils gnu-sed, который установит gzcatи т. Д. И gsed). Это предоставит вам реализацию GNU каждой команды.

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

Используйте реализацию GNU для сжатия и извлечения архивов. Я бы сказал, что нельзя смешивать использование реализации OS X и GNU.

Peterino
источник
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будет работать.

Надеюсь, это поможет!

Jigarius
источник
0

Версия Mac OS X gzip(1) не поддерживает чтение zip-файлов . Со страницы руководства:

Эта версия gzip также способна распаковывать файлы, сжатые с помощью compress(1)или bzip2(1).

Но версия для Linux (GNU) делает .

gunzipв настоящее время может распаковывать файлы , созданные с помощью gzip, zip, compress, compress -Hили pack.

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

Майкл Хэмптон
источник
Поиск в Интернете и установка нового программного обеспечения никогда не будут путём наименьшего сопротивления.
vy32
0

Забавно, у меня была та же проблема при выполнении bashскрипта 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сценарии.

Может быть, это кому-то пригодится.

Лучший,

шлифовальная машинка

Сандер В. ван дер Лаан
источник