zcat / gzcat działa w systemie Linux, a nie w systemie OSX. ogólna kompatybilność z linux / osx

50

Najpierw konkretny problem: w systemie Linux używam zcat do wyświetlenia pliku .zip. W OSX wydaje się, że zcat automatycznie dołącza .Z do nazwy pliku. Różne osoby sugerują zamianę zcat na gzcat; Jednak gzcat skarży się, że plik nie jest w formacie gzip!

„plik” pokazuje to: ... Zarchiwizuj dane archiwalne, co najmniej v2.0 do wyodrębnienia

Więc ani Zcat, ani gzcat nie będą działać w systemie OSX, co mogę zrobić?

Mam średniej wielkości skrypt w bash, który używa, zcat / gzcat, sed awk i innych podstawowych narzędzi do przetwarzania wielu plików. Chciałbym zduplikować to środowisko na moim laptopie osx, aby móc pracować w trybie offline. Jakieś ogólne sugestie, jak mogę uniknąć takiego bólu? Oczekuję, że jest to dość rutynowy przepływ pracy, więc inni musieli rozwiązać ten problem.

użytkownik23398
źródło
2
Jeśli są to dane archiwalne Zip, nie są w formacie gzip!
Michael Hampton
@MichaelHampton Mogę zcat na Linuksie w porządku. Ani Zcat, ani gzcat nie działa na systemie OSX. Jak mogę to rozwiązać? Czy istnieje inny zestaw narzędzi, które mogę zainstalować, które będą działały zarówno na systemie Linux, jak i OSX? Te skrypty są moje, więc mogę je zmieniać (chociaż chciałbym, aby były proste). Kontroluję również środowiska linux / osx, więc mogę również wykonywać proste instalacje na obu.
user23398
Nie powiedziałbym, że to rutyna. Zwykle używam zipdo obsługi plików zip, a nie gzip.
Michael Hampton

Odpowiedzi:

89

Masz rację. To irytujące zachowanie.

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

Spróbuj tego:

$ zcat < foo.txt.gz 
asdfadsf
vy32
źródło
2
Działa to dobrze w OS X.
Valerio Schiavoni
1
Najwyraźniej moja odpowiedź jest błędna. Linux zcatbędzie czytał .zipi .Zzapisywał pliki. Nie chodzi tu o plik stdin vs. nazwany, lecz o to, że opiekunowie programów w Linuksie zmodyfikowali tak, gzcataby czytali dużą liczbę niepowiązanych typów plików.
vy32
Jak powiązamy to z innym procesem?
Petah,
Użyj |do potoku do innego procesu:cat < foo.txt.gz | wc
vy32 11.10.17
To naprawi twój problem, przynajmniej w OSX
jimh
18

Wiem, że to stare pytanie. Znalazłem jednak rozwiązanie z jeszcze starszego wątku github .

Możesz po prostu użyć gunzip -ctego, który działa podobnie jak zcatbez błędów w Mac OS X.

$ gunzip -c 20150707_backup.sql.gz | mysql -u mysql_user -p
dakdad
źródło
13

Możesz zainstalować narzędzia GNU dla Mac OS X, np. Używając homebrew (uruchom brew install coreutils gnu-sed, który instaluje gzcati wsp. Oraz gsed). Zapewni to implementację GNU każdej komendy.

Następnie, aby ułatwić sobie życie, utwórz zmienną dla każdego polecenia (np. sed=gsedI użyj go $sedpóźniej) lub po prostu alias (np. alias sed=gsed) W dowolnym skrypcie, który piszesz. Dla twojej wygody napisałem Gist: gnu-tools-for-mac.sh . Umieść (lub dołącz) ten kod na swoich skryptach.

Użyj implementacji GNU do kompresji i rozpakowywania archiwów. Powiedziałbym, że nie można łączyć zastosowań implementacji OS X i GNU.

Peterino
źródło
3
Możesz również dodać /usr/local/opt/coreutils/libexec/gnubindo swojego PATH, który udostępni je bez gprefiksu.
bfontaine
3

Właśnie spróbowałem i znalazłem coś bardzo interesującego! W przypadku gzplików oczekuje się, że będziemy działać gzcatw systemie Mac OS.

Rozwiązanie 1

  • Użyj gzcat /path/to/file.gzi powinno działać.
  • Korzystanie zcat /path/to/file.gzspowoduje błąd.

Rozwiązanie 2

  • Podłącz plik do zcati będzie działać.
  • Na przykład cat /path/to/file.gz | zcatbędzie działać.

Mam nadzieję, że to pomoże!

Jigarius
źródło
0

Wersja Mac OS X gzip(1) nie obsługuje odczytu plików zip . Ze strony podręcznika:

Ta wersja gzip jest również zdolna do dekompresji plików skompresowanych przy pomocy compress(1)lub bzip2(1).

Ale wersja Linux (GNU) tak .

gunzipObecnie można rozpakować pliki utworzone przez gzip, zip, compress, compress -Hlub pack.

Firmy trzecie spakowały GNU gzip dla Mac OS X; możesz je znaleźć w wyszukiwarce internetowej. To prawdopodobnie ścieżka najmniejszego oporu.

Michael Hampton
źródło
Przeszukiwanie Internetu i instalowanie nowego oprogramowania nigdy nie jest drogą najmniejszego oporu.
vy32
0

Zabawne, miałem ten sam problem podczas wykonywania bashskryptu bash somescript.sh, który wykonywał pętlę for gzcatwewnątrz. Ale próbuje te rzeczy wewnątrz tej somescript.sh-script ...:

  1. zcat < file.txt.gz
  2. Zainstalowałem brew install coreutilsjuż, ale mimo to ponownie zainstalowałem:brew reinstall coreutils
  3. gunzip -c file.txt.gz

... nic nie znaczyło ...

Ale użyłem również odniesienia do katalogu:

SOMEDIR="~/DIR1/DIR2/DATA"

Który jest interpretowany jako ~/DIR1/DIR2/DATAi najwyraźniej nie działa w ramach bash-script wewnątrz macOS. To działało:

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

Co jest interpretowane jako /Users/someuser/DIR1/DIR2/DATA. Nie wiem dlaczego - nie jestem ekspertem od technologii macOS-BASH - ale działało to w połączeniu z moim oryginalnym kodem ...

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

... w moim somescript.shskrypcie.

Może komuś się przyda.

Najlepsza,

Szlifierka

Sander W. van der Laan
źródło